где найти недостающие необязательные задачи муравья? - PullRequest
12 голосов
/ 10 марта 2011

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

Ответы [ 2 ]

6 голосов
/ 10 марта 2011

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

Для второй части вашего вопроса:
РЕШЕНИЕ 1. Вам не нужно изменять переменную CLASSPATH. Вместо этого вы можете добавить его, добавив параметр -cp [JAR FILE LOCATION] (-cp для исполняемого файла "java")
РЕШЕНИЕ 2. Jar-файлы - это просто zip-файлы, откройте ant-nodeps.jar, скопируйте его содержимое в ant.jar и удалите ant-nodeps.jar
РЕШЕНИЕ 3. См. Образец ниже. taskdef - это функция муравья, которая загружает 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 голосов
/ 10 марта 2011

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

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

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

Я посмотрел на своем 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 теперь является стандартной задачей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...