Ant не может найти класс, необходимый для заданного пользователем задания задачи

Я пытаюсь использовать задачу axis-java2wsdl ant для создания wsdl из одного из моих классов java, но я не могу получить правильный путь к классу.

Я использую Ubuntu libaxis-java-пакет, который устанавливает ax- ant.jar в $ANT_HOME/lib и axis.jar в /usr/share/java. Интересные части моего файла build.xml выглядят следующим образом:

<property name="library.dir" value="lib"/>
<property name="system.library.dir" value="/usr/share/java"/>
<path id="libraries">
    <fileset dir="${library.dir}">
        <include name="*.jar"/>
    </fileset>
    <fileset dir="${system.library.dir}">
        <include name="*.jar"/>
    </fileset>
</path>

<target name="genwsdl" depends="compile">
    <taskdef resource="axis-tasks.properties" classpathref="libraries"/>
    <axis-java2wsdl>
            details omitted
    </axis-java2wsdl>
</target>

Запуск ant genwsdl приводит к:

/build.xml:50: taskdef A class needed by class
org.apache.axis.tools.ant.wsdl.Wsdl2javaAntTask
cannot be found: org/apache/axis/utils/DefaultAuthenticator

Ant может найти определение задачи axis-java2wsdl, потому что axis- ant.jar находится в $ANT_HOME/lib, но не может найти классы в axis.jar, хотя эта банка включена путь, определенный "библиотеками"

Я знаю, что это проблема с classpath, потому что мне удалось пропустить DefaultAuthenticator другому классу, не найденному symlinking axis.jar в $ANT_HOME/lib. Как я могу получить taskdef для распознавания файлов jar в каталоге /usr/share/lib или в каталоге моего локального каталога проекта без символической привязки всего к $ANT_HOME/lib?

EDIT:

Наконец, я смог успешно сгенерировать wsdl с помощью этой строки:

ant -lib /usr/share/java/axis.jar -lib /usr/share/java/jaxrpc.jar -lib /usr/share/java/wsdl4j.jar -lib /usr/share/java/commons-logging.jar -lib /usr/share/java/commons-discovery.jar -lib build genwsdl

Я все равно был бы очень признателен, если бы кто-нибудь мог сказать мне, что я делаю неправильно, не имея возможности определить эти библиотеки в файле build.xml

Ответы

Ответ 1

В общем, это работает. Но вам нужно очень внимательно проверить, какие классы есть.

Если ваш класс задачи может быть загружен в загрузчик классов выше в иерархии загрузчика классов (например, CLASSPATH или ANT_HOME/lib), ваш классpathpath просто будет проигнорирован.

Подробнее читайте часто задаваемые вопросы.

Ant реализация загрузчика класса использует модель делегирования Java

Класс ClassLoader использует модель делегирования для поиска классов и ресурсов. Каждый экземпляр класса ClassLoader имеет связанный загрузчик родительского класса. Когда требуется найти класс или ресурс, экземпляр ClassLoader будет делегировать поиск класса или ресурса его загрузчику родительского класса, прежде чем пытаться найти сам класс или ресурс. Встроенный загрузчик классов виртуальной машины, называемый загрузчиком загрузки bootstrap, сам по себе не имеет родителя, но может служить родителем экземпляра ClassLoader.

Примечание: запуск ant -diagnostics также может помочь.

Ответ 2

Ant механизм для добавления библиотек:

  • через аргумент командной строки -lib
  • добавление к ${user.home}/. ant/lib
  • добавление к ${ ant.home}/lib

только. manual ничего не упоминает об использовании свойства system.library.dir. Наверное, это в значительной степени игнорируется для этой цели.

Кроме того, запустите ant в подробном режиме (и -verbose), чтобы увидеть, что делается под капотом.

Ответ 3

Почему бы просто не взять простейший вариант и указать путь к классам в <taskdef>?

<taskdef resource="axis-tasks.properties">
    <classpath>
        <fileset file="/path/to/axis/jars"/>
    </classpath>
</taskdef>

Или создайте вторую запись <classpath>, которая подмножит library.dir?

<path id="axis-tools-classpath">
    <fileset dir="/path/to/axis/home">
        <include name="*.jar"/>
    </fileset>
    <path refid="library.dir"/>
</path>

Беседа с ${ant.home}/lib не такая хорошая идея и ее можно почти всегда избегать.

Ответ 4

Это работает для меня, чтобы указать путь к классам непосредственно в задаче taskdef, как указано матом b. Для моего проекта я считаю полезным включить библиотеку taskdef в папке проекта и указать путь к классам в файле сборки ant, чтобы просто настроить другие разработки. Я использую следующий taskdef:

<taskdef resource="antenna.properties" classpath="${myprojectroot}/lib/antenna-bin-1.2.1-beta.jar"/>

Обратите внимание, что это может не работать для версий ant раньше 1.7.0.

Ответ 5

Используя ответы отсюда и всю частичную информацию, я придумал решение. Я добавил банку файл ant, необходимый для папки lib в проекте (в частности, драйверы mysql jdbc). Затем я запускаю задачу настройки в ant, которая копирует в домашнюю папку пользователя .ant/lib, а затем сбой ant с сообщением для перезапуска. Он только терпит неудачу один раз для пользователя, а затем работает каждый раз. Это может быть сложно, если вы обновите банку до новой версии...

Здесь ant build.xml:

<project name="data_source" default="build">

  <!-- BUILD PROPERTIES -->
  <property file="build.properties"/>

  <!-- SQL Server Properties -->
  <property name="sql.driver" value="org.gjt.mm.mysql.Driver"/>
  <property name="sql.url" value="jdbc:mysql://127.0.0.1/datastore"/>
  <property name="sql.user" value="user"/>
  <property name="sql.pass" value="password"/>

  <!-- FILE LOCATIONS  -->
  <property name="sql.dir" location="sql"/>

  <!-- INITIALIZE PROJECT -->
  <target name="init" description="Initialize the project">
      <available property="no.ant.lib.dir" file="${user.home}/.ant/lib/" type="dir" />
  </target>

  <!-- SETUP MYSQL -->
  <target name="setup_mysql" description="Copy the lib so ant can see it" unless="no.ant.lib.dir">
      <mkdir dir="${user.home}/.ant"/>
      <mkdir dir="${user.home}/.ant/lib"/>
      <copy file="lib/mysql-connector-java-5.1.13-bin.jar" todir="${user.home}/.ant/lib"/>

      <!-- ant already missed picking up the jar - we have to restart -->
      <fail message="JDBC mysql class copied to ${user.dir}/.ant/lib/ - please restart ant" />
  </target>

  <!-- BUILD DATA SOURCES -->
  <target name="build" depends="init,setup_mysql,clean_data" description="Create and populate tables">

    <sql driver="${sql.driver}" url="${sql.url}" userid="${sql.user}" password="${sql.pass}" >
      <transaction src="${sql.dir}/create_tables.sql"/>
      <transaction src="${sql.dir}/insert_data.sql"/>
    </sql>
  </target>

   <!-- CLEAN PROJECT -->
  <target name="clean" description="Cleans up project build">
    <!-- Don't clean data sources here - may get called by accident -->
  </target>

  <!-- Delete all tables and data -->
  <target name="clean_data" description="Deletes all data and tables">
    <echo>Dropping all database tables in ${sql.schema}...</echo>
    <property name="exec.command" value="mysqldump -u${sql.user} -p${sql.pass} --add-drop-table --no-data ${sql.schema} | grep ^DROP | mysql -u${sql.user} -p${sql.pass} ${sql.schema}" />
    <exec executable="sh">
      <arg value = "-c"/>
      <arg value="${exec.command}"/>
    </exec>

  </target>

</project>

Надеюсь, что это поможет

Ответ 6

Я столкнулся с той же проблемой, когда я скопировал *.jar в { ant.home}/libs, тогда я пользователь -lib, чтобы найти *.jar, он работает нормально! Я считаю, что новые банки не могут быть загружены, тогда я проверю это!