首先,您必须定义一个<taskdef>
指向 Ivy 的任务。
<property environment="env"/>
<property name="ivy.home" value="${env_IVY_HOME}"/>
<taskdef resource="org/apache/ivy/ant/antlib.xml">
<classpath>
<fileset dir="${ivy.home}">
<include name="*.jar"/>
</fileset>
</classpath>
</taskdef>
这将使您可以访问常春藤任务。你会像这样使用这些任务:
<cachepath pathid="main.classpath" conf="compile"/>
问题是您的 Ivy 任务名称可能与其他 Ant 任务发生冲突。例如,有一个 Ivy 任务<report>
。为了解决这个问题,您可以创建一个 Ivy 命名空间。为此,您在<project>
实体的命名空间中放置一个引用,如下所示:
<project name="my.proj" default="package" basedir="."
xmlns:ivy="antlib:org.apache.ivy.ant"/>
现在,当您定义 Ivy 任务时,您可以使用对该名称空间的antlib:org.apache.ivy.ant
引用。ivy
与以前相同的 taskdef,但有一个uri
字段:
<property environment="env"/>
<property name="ivy.home" value="${env_IVY_HOME}"/>
<taskdef resource="org/apache/ivy/ant/antlib.xml"
uri="antlib:org.apache.ivy.ant">
<classpath>
<fileset dir="${ivy.home}">
<include name="*.jar"/>
</fileset>
</classpath>
</taskdef>
顺便说一句,这并没有什么特别之处uri
。我可以这样做:
<project name="my.proj" default="package" basename="."
xmlns:ivy="pastrami:with.mustard">
[...]
<taskdef resource="org/apache/ivy/ant/antlib.xml"
uri="pastrami:with.mustard">
<classpath>
<fileset dir="${ivy.home}">
<include name="*.jar"/>
</fileset>
</classpath>
</taskdef>
现在的重点是您可以在任务名称前加上ivy:
. 而不是这个:
<cachepath pathid="main.classpath" conf="compile"/>
您现在可以这样做:
<ivy:cachepath pathid="main.classpath" conf="compile"/>
这就是您访问 Ivy Ant 任务的方式。
现在,您可以访问您的 Ivy Ant 任务,您需要定义一个ivysettings.xml
文件并使用该<ivy:settings/>
任务指向那里:
<ivy:settings file="${ivy.home}/ivysettings.xml"/>
Ivy 中嵌入了一个默认ivysettings.xml
文件,它将指向全球 Maven 存储库系统。如果您没有公司范围的 Maven 存储库,则可以使用默认ivysettings.xml
文件:
<ivy:settings/>
这很简单。
完成此操作后,您需要读取并解析ivy.xml
文件,该文件通常位于项目的根目录中,与文件位于同一目录中build.xml
。
基本上,您的ivy.xml
文件包含对您想要带入项目的第三方 jar 的引用。例如:
<dependencies>
<dependency org="log4j" name="log4j" rev="1.2.17" conf="compile->default"/>
<dependency org="junit" name="junit" rev="4.10" conf="test->default"/>
</dependencies>
这就是说我需要log4j.jar
(revision 1.2.17) 来编译(以及编译测试),我需要junit.jar
(revision.4.10) 来编译我的测试代码。
这compile->default
是我的compile
配置到 Mavendefault
配置的映射(这表示我只想要 Jar 和它可能依赖的任何其他 jars。
我的compile
配置来自哪里?我在我的ivy.xml
. 有十种标准配置。这也进入您的ivy.xml
文件:
<configurations>
<conf name="default" visibility="public" description="runtime dependencies and master artifact can be used with this conf" extends="runtime,master"/>
<conf name="master" visibility="public" description="contains only the artifact published by this module itself, with no transitive dependencies"/>
<conf name="compile" visibility="public" description="this is the default scope, used if none is specified. Compile dependencies are available in all classpaths."/>
<conf name="provided" visibility="public" description="this is much like compile, but indicates you expect the JDK or a container to provide it. It is only available on the compilation classpath, and is not transitive."/>
<conf name="runtime" visibility="public" description="this scope indicates that the dependency is not required for compilation, but is for execution. It is in the runtime and test classpaths, but not the compile classpath." extends="compile"/>
<conf name="test" visibility="private" description="this scope indicates that the dependency is not required for normal use of the application, and is only available for the test compilation and execution phases." extends="runtime"/>
<conf name="system" visibility="public" description="this scope is similar to provided except that you have to provide the JAR which contains it explicitly. The artifact is always available and is not looked up in a repository."/>
<conf name="sources" visibility="public" description="this configuration contains the source artifact of this module, if any."/>
<conf name="javadoc" visibility="public" description="this configuration contains the javadoc artifact of this module, if any."/>
<conf name="optional" visibility="public" description="contains all optional dependencies"/>
</configurations>
你可以使用任何你想要的配置名称,但是这些映射到默认的 Maven 配置并且被广泛使用。
一旦你ivy.xml
定义了你的文件,你就可以使用它<ivy.resolve>
来解决你的依赖:
<ivy:resolve/>
所以,我们有以下内容:
- 如何
<taskdef>
在您build.xml
的构建中使用 Ivy Ant 任务。
- 如何使用 Ivy Ant 任务
<ivy:settings>
来配置 Ivy。
- 如何使用
<ivy:resolve/>
读取您的ivy.xml
文件并解决您的第三方 jar 依赖项。
现在,您可能想要实际使用这些 jar 文件。有三种方法可以做到这一点:
<ivy:cachepath pathid="main.classpath" conf="compile"/>
该<ivy:cachepath/>
任务将创建一个指向您在文件配置中拥有的 jar 的类路径(在本例中称为main.classpath )。大多数时候都使用这个。ivy.xml
compile
如果你需要一个文件集,你可以使用这个:
<ivy:cachefileset setid="compile.fileset" conf="compile"/>
在这种情况下,它将创建一个 refid 为compile.fileset
.
有时您必须将罐子带入您的项目中。例如,如果你创建了一个 war 或 ear 文件,你想把你的 jar 包起来。在这种情况下,你可以使用这个:
<property name="lib.dir" value="${target.dir}/lib"/>
<ivy:retrieve pattern="${lib.dir}/[artifact].[ext]"
conf="runtime"/>
这会将您的 jars 提取到${lib.dir}
目录中,因此您可以将它们包含在 war 或 ear 中。
抱歉,答案很长,但是要涵盖很多步骤。我强烈推荐 Manning 的书Ant in Action,其中有一整章是关于 Ivy 的。