Подтвердить что ты не робот

Где найти отсутствующие необязательные задачи ant?

Мне хотелось посмотреть, какие системные свойства здесь установлены (и к каким значениям), поэтому самый простой способ (если не писать новую программу 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>
4b9b3361

Ответ 1

Когда вы выполняете поиск в Google, результаты указывают на ant -nodeps-1.7.1.jar
Убедитесь, что jar существует, и вы добавили его в путь к классам

Во второй части вашего вопроса:
РЕШЕНИЕ 1. Вам не нужно изменять переменную CLASSPATH. Вместо этого вы можете добавить его, добавив параметр -cp [JAR FILE LOCATION] (-cp для исполняемого файла java)
РЕШЕНИЕ 2. Файлы Jar - это просто zip файлы, откройте ant -nodeps.jar, скопируйте его содержимое в ant.jar throw away ant -nodeps.jar
РЕШЕНИЕ 3. См. пример ниже. taskdef - это функция ant, которая загружает jar или класс в иерархию ClassLoader. (Вы загружаете класс перед его использованием, работает как заклинание)

<?xml version="1.0" encoding="ASCII"?>
<project name="Test" default="properties" basedir=".">

    <target name="properties" depends="init">
        <echoproperties/>
    </target>

    <target name="init">
        <taskdef name="echoproperties" classname="org.apache.tools.ant.taskdefs.optional.EchoProperties">
            <classpath>
                <fileset dir="${ant.library.dir}">
                    <include name="ant-nodeps.jar" />
                </fileset>
            </classpath>
        </taskdef>
    </target>
</project>

Ответ 2

Я загрузил Ant 1.7.1 и просмотрел документацию, которая была с ним. Там он описал echoproperties как необязательную задачу, но не упомянул, где получить jarfile для этой необязательной задачи.

Внутри папки lib я обнаружил ant-nodeps.jar. По-видимому, он был включен с Ant 1.7.1.

Я бы порекомендовал вам загрузить и установить Ant 1.8. Поскольку Ant - это Java файл jar, на самом деле это не так сложно установить последнюю и самую лучшую версию.

Я посмотрел на свой Mac, а /usr/bin/ant - ссылка на /usr/share/ant/bin, а /usr/share/ant/ - ссылка на /usr/share/java/ant-1.8.2. Итак, все, что мне нужно сделать, это указать /usr/share/ant/bin/ на правильную версию Ant.

В Ant 1.8.2 echoproperties теперь является стандартной задачей.