2013-07-03 3 views
12

При попытке скомпилировать Javadoc taglet, который требует $JAVA_HOME/lib/tools.jar, я обнаружил, что муравей (версия 1.8.4) устанавливает java.home к $JAVA_HOME/jre, а не просто $JAVA_HOME , Я проверил это таким образом:

<echo>${java.home}</echo> 
<echo>${env.JAVA_HOME}</echo> 

[echo] /usr/java/jdk1.7.0_21/jre 
[echo] /usr/java/jdk1.7.0_21 

Согласно ant -diagnostics, не существует какой-либо собственности, как jdk.home. Таким образом, чтобы использовать tools.jar я должен сделать:

<classpath location="${java.home}/../lib/tools.jar"/> 

Итак, у меня есть два вопроса:

1) Есть ли что-то не так с моей установкой муравья, который вызывает java.home, чтобы указать на JRE вместо JDK?

2) Если это способ, которым должен работать муравей, использует .. в моем классе, как я должен что-то делать? Или я должен делать ${env.JAVA_HOME}/lib/tools.jar? Или что-то еще?

+0

ant - это сценарий оболочки. Попробуйте запустить его с помощью отладки оболочки (+ x). Убедитесь, что java, найденный муравьем, является реальной java (не какие-либо софт-ссылки) – Jayan

+0

1) Я отредактировал сценарий оболочки, чтобы поместить 'echo $ JAVA_HOME' прямо перед последней строкой, и это было в этой точке без изменений. 2) Я попробовал переименовать каталог JDK и поместить символическую ссылку на новое имя на своем месте. '$ {java.home}' изменено, чтобы отразить переименованный каталог, поэтому он использует правильный каталог. –

+0

Извините, я не видел этого до сих пор! – ingyhere

ответ

7

Вот ответы: "? Есть ли что-то не так с моей установки ..."

  1. Нет. Ant указывает, что это внутренний java.home, основанный на свойствах JVM System. Код для HotSpot (JVM internals) устанавливает его с добавлением «/ jre» специально. Фактически, Java(TM) Tutorials for System Properties описывает это именно так. Переменная «java.home» изнутри муравья действительно не является «одним-в-одном», как «JAVA_HOME», который установлен в вашей среде - другой, но с похожими именами.

  2. «(Что такое), как я должен что-то делать?» Вы действительно можете делать то, что считаете нужным, но помните, что Ant может и обычно запускается в отдельном процессе JVM. Я бы предположил, что ваша системная среда, вероятно, указывает JVM, которая была использована для разработки приложения, поэтому я бы просто использовал «$ {env.JAVA_HOME}», чтобы ожидания развития соответствовали ожиданиям построения.

Для получения дополнительной информации см. another similar answer here.

Кроме того, подумайте, что больше информации можно собрать у муравья, запустив его с помощью флагов -debug, -diagnostics и/или -verbose.

+0

Я получаю одинаковые проблемы с муравьиными точками JAVA_HOME в JAVA_HOME/jre instate JAVA_HOME, как я могу решить эту проблему? –

+0

См. Комментарий после вопроса здесь: http://stackoverflow.com/questions/16533256 – ingyhere

2

Была такая же проблема. Я обнаружил, что добавление fork="true" в тег javac решает эту проблему. Так что сделайте примерно следующее:

<javac target="1.7" source="1.7" fork="true" ...> 

Я благодарю всех, кто может объяснить, почему это работает.

+0

Вероятность вашей среды задает $ JAVA_HOME как путь JDK. [Антенна документации] (https://ant.apache.org/manual/Tasks/javac.html) указывает (относительно 'fork = true'),« По умолчанию компилятор версии Java, в которой в настоящее время запущен Ant ». Таким образом, сам скрипт Ant не устанавливает неправильный путь к JDK - вам действительно нужно изменить поведение 'javac'' fork' для этого. Банки находятся в JDK, где они должны быть расположены. – ingyhere

+0

Я искал решение в течение 3 часов. Наконец я нашел его. Я добавил (fork = "true") и решил все мои проблемы. Для обмена так много благодарностей. – NovaYear

Смежные вопросы