Как загрузить необязательную задачу в ant без -lib или глобальной установки? - PullRequest
16 голосов
/ 23 января 2009

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

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

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

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

СТРОИТЬ СБОЙ /my/path/build.xml:13: класс taskdef org.apache.tools.ant.taskdefs.optional.net.FTP не найден

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

Ответы [ 6 ]

12 голосов
/ 26 января 2009

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

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

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

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

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

6 голосов
/ 13 мая 2009

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

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

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

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

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

или "loader =" project ""

Тогда вы определили свою задачу:

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

и иди: -)

4 голосов
/ 15 июля 2010

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

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

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

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

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

Надеюсь, это поможет некоторым.

1 голос
/ 11 июля 2015

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

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

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

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

0 голосов
/ 23 января 2009

Будет ли это работать при условии, что 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>
0 голосов
/ 23 января 2009

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

<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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...