2

我正在使用 Ant 和 Ivy 构建一个项目。该build.xml文件依赖于ant-contribbean scripting frameworkbeanshellcommons-logging

Ant 在多个地方搜索库,包括${user.home}/.ant/lib.

如果这些库尚不存在,文件中是否有任何方法build.xml可以让这些库自动下载并安装在目录中,也许使用 Ivy 本身?${user.home}/.ant/lib

谢谢,拉尔夫

4

3 回答 3

5

您的 ant lib 中唯一需要的 jar 是 ivy :-)

在您的ivy.xml文件中正常声明您的依赖项。使用配置将与 ANT 任务关联的 jar 集中分组:

<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"/>
于 2010-09-16T23:12:02.123 回答
3

我在阅读常春藤缓存文件集文档时遇到了这个问题,其中指出:

请更喜欢使用检索 + 标准 ant 路径创建,这使您的构建更独立于 ivy(一旦正确检索工件,就不再需要 ivy)。

常春藤缓存路径文档类似地指出:

如果你想让你的构建更独立于 Ivy,你可以考虑使用检索任务。一旦工件被正确检索,您就可以使用标准的 Ant 路径创建,这使得 Ivy 不再需要。

因此,似乎更好的答案是修改 Mark 对将检索与 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: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。

ivy 的目的是你用它来拉下你的罐子(解决和检索)。安装好它们后,您可以切换回使用标准 Ant。


注意:我只是将这些依赖项拉到 lib 目录中。这将简化检索任务:

<ivy:retrieve conf="tasks" />

另请注意:访问此页面的“类路径结构”部分以获取有关“标准蚂蚁路径创建”的更多信息

于 2011-02-03T04:06:57.423 回答
2

我会使用 ant 来安装所有东西 INTO ant =D

只需使用depends="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-resolve 了:

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

我相信您可以找到类似的方法来安装您可能需要的任何 ant 任务。

于 2011-06-30T21:19:55.483 回答