Я хотел посмотреть, какие системные свойства здесь заданы (и какие значения), поэтому самым простым способом (если бы здесь не была написана новая Java-программа) было бы добавить несколько строк в мой скрипт сборки ant:
<target name="properties">
<echoproperties/>
</target>
Но при запуске ant выдает следующее сообщение об ошибке:
/u/ebermann/projektoj/stackoverflow-examples/build.xml:19: Problem: failed to create task or type echoproperties
Cause: the class org.apache.tools.ant.taskdefs.optional.EchoProperties was not found.
This looks like one of Ant's optional components.
Action: Check that the appropriate optional JAR exists in
-/usr/share/ant/lib
-/u/ebermann/.ant/lib
-a directory added on the command line with the -lib argument
Do not panic, this is a common problem.
The commonest cause is a missing JAR.
This is not a bug; it is a configuration problem
Хорошо, я не паникую, но удивляюсь, что делать.
У меня есть Ant 1.7.1 здесь (система OpenSUSE), и, к сожалению, нет документации для этой версии, и я не root, чтобы установить либо текущую версию ant, либо документацию для старой версии (я только что скачал ее и это все еще не говорит, какой файл фляги необходим здесь). Из перечисленных выше каталогов существует только /usr/share/ant/lib
, но он не содержит ничего подобного optional
.
Я бы хотел скачать необходимый файл jar и поместить его в свой домашний каталог, но где его найти? ant download архив не содержит ничего подобного, и я понятия не имею, где еще искать. (Я немного погуглил, но ничего не нашел.
Итак, кто-нибудь может дать мне несколько советов, где найти правильный файл фляги?
(Полагаю, решение довольно простое, и что-то просто блокирует мой взгляд.)
После ответа vahapt я загрузил файл из apache репозитория и поместил его в каталог /u/ebermann/.ant/lib
, указанный в сообщении об ошибке. Повторный запуск ant properties
- тот же результат, что и выше.
$ jar -tf /u/ebermann/.ant/lib/ant-nodeps-1.7.1.jar | grep 'EchoProperties.class'
org/apache/tools/ant/taskdefs/optional/EchoProperties.class
Похоже, это должно работать - сообщение об ошибке просто неверно?
Если я положу его прямо в CLASSPATH, это сработает:
$ CLASSPATH=/u/ebermann/.ant/lib/ant-nodeps-1.7.1.jar ant properties
Buildfile: build.xml
properties:
[echoproperties] #Ant properties
[echoproperties] #Thu Mar 10 00:46:22 CET 2011
...
[echoproperties] user.name=ebermann
[echoproperties] user.timezone=
BUILD SUCCESSFUL
Total time: 0 seconds
Я не хочу менять свою обычную переменную CLASSPATH, и она должна работать, помещая ее в этот каталог, или я что-то не так понял?
Есть идеи, или это ошибка муравья?
(Кроме того, почему этот файл нигде не упоминается в документации по муравью?)
Edit:
После ответа от vahapt мой файл сборки ant выглядит следующим образом:
<project name="stackoverflow-examples" basedir=".">
<target name="echoproperties.prepare">
<available property="echoproperties.works"
classname="org.apache.tools.ant.taskdefs.optional.EchoProperties"
/>
</target>
<target name="echoproperties.init"
depends="echoproperties.prepare"
unless="echoproperties.works">
<taskdef name="echoproperties" classname="org.apache.tools.ant.taskdefs.optional.EchoProperties">
<classpath>
<fileset dir="${user.home}/.ant/lib">
<include name="ant-nodeps.jar" />
</fileset>
</classpath>
</taskdef>
</target>
<target name="properties" depends="echoproperties.init">
<echoproperties/>
</target>
</project>
Это перерегистрирует задачу, только если она еще не находится в пути к муравьям. (Таким образом, он также должен работать для полных установок ant, у которых нет этого файла в домашнем каталоге).
Я бы все же сказал, что This is not a bug; it is a configuration problem
не совсем правильно, тем более что помещение файла в указанный каталог делает не справкой .
Еще одно интересное наблюдение: файл nodeps.jar в ${user.home}/.ant/lib
(то есть теперь /u/ebermann/.ant/lib/ant-nodeps.jar
) уже находится в пути к классам (тот, который показан ${java.class.path}
, но, похоже, это не помогает чтобы <echoproperties>
работал без этого taskdef
.
Итак, это тоже работает:
<target name="echoproperties.init"
depends="echoproperties.prepare"
unless="echoproperties.works">
<taskdef name="echoproperties"
classname="org.apache.tools.ant.taskdefs.optional.EchoProperties"
classpath="${java.class.path}" />
</target>