Ant ${java.home} указывает на $JAVA_HOME/jre, а не $JAVA_HOME

При попытке скомпилировать теглет Javadoc, для которого требуется $JAVA_HOME/lib/tools.jar, я обнаружил, что ant (версия 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, нет никакого свойства, подобного a jdk.home. Таким образом, для использования tools.jar мне нужно сделать:

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

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

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

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

Ответ 1

Вот ответы:

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

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

Для получения дополнительной информации см. другой аналогичный ответ здесь.

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

Ответ 2

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

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

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