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

Как загрузить дополнительную задачу в ant без -lib или глобальной установки?

Я хочу использовать задачу FTP в ant, и я нашел соответствующие файлы jar и получил все, что работает нормально. Я поместил файлы jar в каталог "libs" вместе с другими файлами, используемыми в сборке. Единственная проблема заключается в том, что пользователь должен запустить "ant -lib commons-net-ftp-2.0.jar" для создания сборки; Я бы предпочел, чтобы можно было просто запустить "ant" без аргументов.

Считывание страницы ant необязательных заданий, я вижу, что есть пять способов загрузить дополнительные библиотеки в ant, и ни один из них не является тем, что я ищу. Я не хочу заставлять пользователя делать какие-либо изменения в своей системе для выполнения этой задачи; его можно просто загрузить из каталога "libs" внутри нашей исходной папки продукта. Таким образом, это означает, что установка глобального CLASSPATH также отсутствует (что плохое в любом случае).

Последний вариант, как указано в документации, является предпочтительным подходом... загрузка jarfiles отдельно из самой сборки script. Я уже делал это в прошлом с задачами ant -contrib и JUnit, и хотел бы сделать это здесь, но я не вижу, как я могу это сделать. Задача FTP не поддерживает вложенный элемент classpath, и я не знаю XML-ресурса, который мне потребуется для загрузки этой библиотеки через taskdef. Как загрузить библиотеки из ant?

Изменить: В ответ на ответы и вопросы, которые были опубликованы здесь, я использую ant 1.7.1. Создание ftp taskdef определенно не работает; что вызывает следующую ошибку:

СТРОГО НЕИСПРАВНО /my/path/build.xml:13: taskdef класс org.apache.tools.ant.taskdefs.optional.net.FTP не найден.

Возможно, это потому, что имя класса неверно. Как именно я могу найти имя класса, которое я должен использовать, если у меня есть только jarfile? Это нигде не задокументировано, и я не мог найти ничего в самой банке, напоминающей этот путь.

4b9b3361

Ответ 1

Проблема, с которой вы сталкиваетесь, связана с использованием различных загрузчиков классов. Классы Commons Net должны загружаться одним и тем же загрузчиком классов, загружающим задачу FTP. Поскольку при запуске задачи FTP загружается Ant, вам нужно добавить Commons Net в класс Ant classpath, чтобы он загружался одним и тем же загрузчиком классов. Вот почему документация дает вам 4 разных способа сделать это.

Я согласен, что ни один из них не идеален (переменная среды CLASSPATH является наихудшей). Один из способов - предоставить оболочку script вашему проекту, который вызывает Ant и передает соответствующий аргумент -lib. Затем вы получаете возможность использовать это, а не напрямую ссылаться на Ant. Фактически, вы могли бы назвать его "ant", чтобы он запускался вместо существующего "ant" на пути (это работает только в том случае, если текущий каталог находится на пути, впереди других каталогов).

Пятый вариант в документации большой в теории. Наконец, они исправили проблемы загрузки классов в 1.7.0. К сожалению, как вы уже упоминали, никто не настраивал FTP-задачу на использование classpath. Вы можете попробовать отправить запрос на улучшение, но это не поможет в краткосрочной перспективе.

Есть еще один вариант, который не лучше других. Вместо того, чтобы убедиться, что классы Commons Net загружаются загрузчиком классов, загружающим задачу FTP, вы можете убедиться, что задача FTP загружается загрузчиком классов, который загружает классы Commons Net. Для этого вам нужно удалить файл ant -commons-lib.jar из каталога "lib" установки Ant. Это означает, что задача FTP не загружается при запуске. На самом деле, почему дополнительные задачи разбиваются на множество отдельных JAR - чтобы их можно было индивидуально удалить. Поместите этот JAR файл вместе с файлом Commons Net JAR, чтобы он мог быть загружен одновременно. Тогда вы можете сделать что-то подобное (я пробовал это, и он работает):

<taskdef name="ftp"
         classname="org.apache.tools.ant.taskdefs.optional.net.FTP">
  <classpath>
    <pathelement location="${basedir}/lib/ant-commons-net.jar"/>
    <pathelement location="${basedir}/lib/commons-net-2.0.jar"/>
  </classpath>
</taskdef>
<ftp server="yourserver.com"
     userid="anonymous"
     password="blah">
  <fileset dir="somedirectory"/>
</ftp>

Но это, вероятно, худший вариант, чем просто использование -lib-переключателя (с или без оболочки script). Единственное, что я могу придумать, - попытаться найти стороннюю задачу FTP для использования вместо стандартного.

Ответ 2

У меня есть решение:

вы можете загрузить новую задачу "classloader" из http://enitsys.sourceforge.net/ant-classloadertask/ и загрузить ее:

    <taskdef resource="net/jtools/classloadertask/antlib.xml"
            classpath="XXX/ant-classloadertask.jar"/>

Naw может делать такие вещи, как загрузка классов с тем же загрузчиком классов, что ant используется для его задачи:

    <classloader loader="system" classpath="XXX/commons-net-2.0.jar"/>

или "loader =" project ""

Затем вы определяете свою задачу:

    <taskdef name="ftp" classname="org.apache.tools.ant.taskdefs.optional.net.FTP"/>    

и go: -)

Ответ 3

Итак, мне удалось сделать это для ant -salesforce.jar, который вы получаете при попытке работать с Salesforce (весело...)

Проверьте, есть ли в jar файл xml, который выглядит примерно так:

<antlib>
  <typedef name="compileAndTest" classname="com.salesforce.ant.CompileAndTest"/>
  ....
</antlib>

Затем в ant дайте ему taskdev, который читает этот файл изнутри данного флага, например:

<taskdef resource="com/salesforce/antlib.xml" classpath="lib/ant-salesforce.jar" />

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

Ответ 4

А, мужик, это так противно. Я запускаю ant из затмения. Я не хочу перенастраивать ant в eclipse для новых рабочих областей, поэтому здесь я решил сделать это, чтобы отделить выполнение задачи и настроить ant. Я извлек задачу ftp в отдельный файл сборки. Затем я добавил собственный вызов в командной строке, чтобы запустить совершенно новый процесс ant с необходимыми библиотеками на пути:

<target name="deploy-ftp">
    <exec command="ant">
        <arg line="-buildfile ftp.xml deploy-ftp -lib lib/ant"/>
    </exec>
</target>

Теперь мастер файл сборки может быть запущен без каких-либо специальных аргументов, и никаких изменений в установке ant не требуется. Это неприятно, хотя, поскольку задача ftp работает в полностью чистой среде. Доступны никакие свойства и пути из файла основной сборки. К счастью, у меня все они были в отдельном файле свойств, поэтому мне нужен только один импорт.

Я хотел бы поблагодарить Дэна Дайера. Без вашего подробного объяснения того, что происходит за кулисами, я бы не нашел этого решения.

Ответ 5

У ваших пользователей есть ant, установленные на их машинах, но вы не можете/не хотите, чтобы они добавляли банку FTP? Можете ли вы расслоить ant, чтобы ваш проект выполнял задачи, которые вызывают набор ant, с размещенными банками, чтобы он работал следующим образом:

<taskdef name="ftp" classname="org.apache.tools.ant.taskdefs.optional.net.FTP">
  <classpath>
    <pathelement location="\lib\commons-net-1.4.0.jar"/>
  </classpath>
</taskdef>
<target name="testFtp">
  <ftp server="blah" userid="foo" password="bar">
    <fileset file="test.file" />
  </ftp>
</target>

Ответ 6

Будет ли эта работа предполагать, что libs находится непосредственно под вашим базовым каталогом проекта

<taskdef name="ftp" classname="org.apache.tools.ant.taskdefs.optional.net.FTP">
  <classpath>
    <pathelement location="${basedir}\libs\commons-net-1.4.0.jar"/>
  </classpath>
</taskdef>