Мне хотелось посмотреть, какие системные свойства здесь установлены (и к каким значениям), поэтому самый простой способ (если не писать новую программу Java здесь) - добавить некоторые строки в мою конструкцию ant build script
<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 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, либо документации для старой версии (I просто скачал его, и он до сих пор не говорит, какой файл jar нужен здесь). Из перечисленных выше каталогов существует только /usr/share/ant/lib
, но в нем нет ничего, как optional
.
Я хочу загрузить необходимый файл jar и поместить его в свой домашний каталог, но где его найти? Архив ant не содержит ничего подобного, и я понятия не имею, где еще искать. (Я немного сделал google, но ничего не нашел.
Итак, может кто-нибудь дать мне несколько указателей, где найти правильный файл jar?
(Я полагаю, что решение довольно простое, и что-то просто блокирует мой взгляд.)
После ответа 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, и она должна работать, помещая ее в этот каталог или я понял что-то неправильно?
Любые идеи, или это ошибка ant?
(Кроме того, почему этот файл нигде не упоминается в документации ant?)
Edit:
После ответа от vahapt мой файл ant build выглядит следующим образом:
<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. (Таким образом, он также должен работать для полных установок 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>