Использование Ivy для загрузки / установки ant-contrib, bsf, beanshell, commons-logging - PullRequest
2 голосов
/ 16 сентября 2010

Я строю проект, используя Ant и Ivy. Файл build.xml зависит от ant-contrib , инфраструктуры сценариев bean , beanshell и commons-logging .

Ant ищет библиотеки в нескольких местах, включая ${user.home}/.ant/lib.

Есть ли способ в файле build.xml, чтобы эти библиотеки автоматически загружались и устанавливались в каталог ${user.home}/.ant/lib, если их еще нет, возможно, с использованием самого Ivy?

Спасибо, Ральф

Ответы [ 3 ]

5 голосов
/ 17 сентября 2010

Единственный кувшин, который вам нужен в вашей библиотеке, - это плющ: -)

Объявите ваши зависимости как обычно в вашем файле ivy.xml . Используйте конфигурацию для коллективной группировки jar-файлов, связанных с заданиями ANT:

<configurations>
    <conf name="tasks" description="Ant tasks"/>
</configurations>

<dependencies>
    <dependency org="ant-contrib" name="cpptasks" rev="1.0b5" conf="tasks->default"/>
    <dependency org="junit" name="junit" rev="3.8" conf="tasks->default"/>
    ..

В вашем файле build.xml вы можете создать путь из этой конфигурации

<ivy:resolve/>
<ivy:cachepath pathid="tasks.path" conf="tasks"/>

<taskdef name="task1" classname="??" classpathref="tasks.path"/>
<taskdef name="task2" classname="??" classpathref="tasks.path"/>
3 голосов
/ 03 февраля 2011

Я столкнулся с этим вопросом, когда читал документацию Ivy cachefileset , в которой говорится:

Пожалуйста, предпочтите использование получения + стандартное создание пути муравья, которое делает ваша сборка более независима от плюща (как только артефакты правильно извлечено, плющ не требуется больше).

В документации к кэше Ivy также указано:

Если вы хотите сделать свою сборку более независимо от плюща, вы могли бы рассмотреть возможность использования задачи извлечения. однажды артефакты правильно извлечены, Вы можете использовать стандартное создание пути Ant что делает плющ не нужно больше.

Так что, казалось бы, лучше было бы изменить ответ Марка на что-то, что использует retrieve в сочетании с путями муравья. Что-то вроде следующего:


Ответ Марка (изменен)
<configurations>
  <conf name="tasks" description="Ant tasks"/>
</configurations>

<dependencies>
  <dependency org="ant-contrib" name="cpptasks" rev="1.0b5"
      conf="tasks->default"/>
  <dependency org="junit" name="junit" rev="3.8" conf="tasks->default"/>
  ..

В вашем файле build.xml вы можете создать путь из этой конфигурации

<ivy:retrieve conf="tasks"
     pattern="${dir.where.you.want.taskdef.jars}/[artifact]-[revision].[ext] />

<path id="tasks.path">
  <fileset dir="${dir.where.you.want.taskdef.jars}">
    <include name="**/*.jar"/>
  </fileset>
</path>

<taskdef name="task1" classname="??" classpathref="tasks.path"/>
<taskdef name="task2" classname="??" classpathref="tasks.path"/>

Это даже позволит вам переместить задачу извлечения в отдельный файл ant, который имеет дело с зависимостями. Таким образом, вам не нужно полагаться на ivy после того, как ваши зависимости извлечены в их каталоги.

Цель плюща состоит в том, чтобы вы использовали его, чтобы вытащить банки (разрешить и получить). Как только вы их установите, вы можете вернуться к использованию стандартного Ant.

<ч /> Примечание: я бы просто вытащил эти зависимости в каталог lib. Это упростит задачу извлечения:

<ivy:retrieve conf="tasks" />

Также обратите внимание: посетите раздел 'Path-like Structures' на этой странице, чтобы узнать больше о "создании стандартного пути муравья"

2 голосов
/ 01 июля 2011

Я бы использовал ant для установки всего INTO ant = D

Просто используйте зависимость = "init-ant-contrib, init-ivy"

<!-- ANT-CONTRIB Auto Installer -->
<available property="ant-contrib-exists"
           file="${ant.library.dir}/ant-contrib-1.0b3.jar" />
<target name="download-ant-contrib" unless="ant-contrib-exists">
  <mkdir dir="${ant.library.dir}" />
  <get src="http://downloads.sourceforge.net/project/ant-contrib/ant-contrib/1.0b3/ant-contrib-1.0b3-bin.zip?r=http%3A%2F%2Fsourceforge.net%2Fprojects%2Fant-contrib%2Ffiles%2Fant-contrib%2F1.0b3%2F&amp;use_mirror=cdnetworks-us-1"
       dest="${ant.library.dir}/ant-contrib-1.0b3-bin.zip"
       username="true" />
  <unzip src="${ant.library.dir}/ant-contrib-1.0b3-bin.zip"
         dest="${ant.library.dir}"
         overwrite="no" />
  <move todir="${ant.library.dir}">
    <fileset file="${ant.library.dir}/ant-contrib/*.jar" />
    <fileset file="${ant.library.dir}/ant-contrib/lib/*.jar" />
  </move>
  <delete file="${ant.library.dir}/ant-contrib-1.0b3-bin.zip" />
  <delete dir="${ant.library.dir}/ant-contrib" />
</target>
<target name="init-ant-contrib" depends="download-ant-contrib">
  <taskdef resource="net/sf/antcontrib/antcontrib.properties">
    <classpath>
      <pathelement location="${ant.library.dir}/ant-contrib-1.0b3.jar" />
    </classpath>
  </taskdef>
</target>

<!-- IVY Auto Installer -->
<property name="ivy.install.version" value="2.1.0-rc2" />
<condition property="ivy.home" value="${env.IVY_HOME}">
  <isset property="env.IVY_HOME" />
</condition>
<property name="ivy.home" value="${user.home}/.ant" />
<property name="ivy.jar.dir" value="${ivy.home}/lib" />
<property name="ivy.jar.file" value="${ivy.jar.dir}/ivy.jar" />
<available file="${ivy.jar.file}" property="ivy-exists" />
<target name="download-ivy" unless="ivy-exists">
  <mkdir dir="${ivy.jar.dir}" />
  <!-- download Ivy from web site so that it can be used even without any special installation -->
  <get src="http://repo2.maven.org/maven2/org/apache/ivy/ivy/${ivy.install.version}/ivy-${ivy.install.version}.jar"
       dest="${ivy.jar.file}"
       usetimestamp="true" />
</target>
<target name="init-ivy" depends="download-ivy">
  <!-- try to load ivy here from ivy home, in case the user has not already dropped
              it into ant's lib dir (note that the latter copy will always take precedence).
              We will not fail as long as local lib dir exists (it may be empty) and
              ivy is in at least one of ant's lib dir or the local lib dir. -->
  <path id="ivy.lib.path">
    <fileset dir="${ivy.jar.dir}" includes="*.jar" />
  </path>
  <taskdef resource="org/apache/ivy/ant/antlib.xml"
           uri="antlib:org.apache.ivy.ant"
           classpathref="ivy.lib.path" />
</target>

Теперь, когда у вас есть ant-contrib & ivy, все остальное должно быть простым ivy.xml & ivy-resolved:

<target name="resolve" depends="init-ivy">
    <ivy:retrieve />
  </target>

Я уверен, что вы можете найти похожие методы установки любой задачи ant, которая вам может понадобиться.

...