如何为蚂蚁构建配置常春藤

2022-09-02 14:15:52

我目前位于 .ANT_HOME/home/<myuser>/ant/1.8.4/ant-1.8.4

我刚刚下载了Apache Ivy tarball,其中包含其依赖项。我把它提取到./home/<myuser>/ivy/2.3.0-rc1/ivy-2.3.0-rc1

然后我复制到.如果我对Ant如何使用插件/扩展的理解是正确的,那么Ant现在应该能够在运行时访问Ivy的所有任务。/home/<myuser>/ivy/2.3.0-rc1/ivy-2.3.0-rc1/lib/*.jarANT_HOME/lib

我的下一个问题是,如何在 Ant 构建文件中定义 Ivy 任务?假设我想使用 和 任务。当我从命令行运行我的 Ant 构建时,我需要执行哪些配置(在 XML 中)才能使这些任务正常工作(我不会通过 Ant-Eclipse 插件进行构建)。提前致谢!ivy-retrieveivy-resolveivy-publish


答案 1

首先,您必须定义一个指向常春藤任务的 to。<taskdef>

<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><project>

<project name="my.proj" default="package" basedir="."
    xmlns:ivy="antlib:org.apache.ivy.ant"/>

现在,在定义 Ivy 任务时,可以使用该引用来命名空间。与以前相同的任务定义,但带有一个字段:antlib:org.apache.ivy.antivyuri

<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任务,您需要定义一个文件并使用该任务指向那里:ivysettings.xml<ivy:settings/>

 <ivy:settings file="${ivy.home}/ivysettings.xml"/>

Ivy中嵌入了一个默认文件,它将指向全球范围的Maven存储库系统。如果您没有公司范围的 Maven 存储库,则可以使用默认文件:ivysettings.xmlivysettings.xml

<ivy:settings/>

这很简单。

完成此操作后,您需要读入并解析文件,该文件通常位于与文件相同的目录中的项目根目录中。ivy.xmlbuild.xml

基本上,您的文件包含对要引入到项目中的第三方jar的引用。例如:ivy.xml

<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>

这是在说,我需要(修订版1.2.17)进行编译(以及编译测试),我需要(修订版.4.10)来编译我的测试代码。log4j.jarjunit.jar

这是我的配置到Maven的配置的映射(它说我只想要Jar和它可能依赖的任何其他jar。compile->defaultcompiledefault

我的配置来自哪里?我在我的.有十种标准配置。这也进入您的文件:compileivy.xmlivy.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/>

因此,我们有以下内容:

  1. 如何使用在你的将常春藤蚂蚁任务合并到你的构建中。<taskdef>build.xml
  2. 如何使用常春藤蚂蚁任务来配置常春藤。<ivy:settings>
  3. 如何使用来读取文件并解析第三方 jar 依赖项。<ivy:resolve/>ivy.xml

现在,您可能希望实际使用这些jar文件。有三种方法可以做到这一点:

 <ivy:cachepath pathid="main.classpath" conf="compile"/>

该任务将创建一个类路径(在本例中称为 main.classpath),该类路径指向文件配置中的 jar。这在大多数时候使用。<ivy:cachepath/>ivy.xmlcompile

如果需要文件集,可以使用以下命令:

 <ivy:cachefileset setid="compile.fileset" conf="compile"/>

在这种情况下,它将创建一个折合为 .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}

很抱歉回答得很长,但有很多步骤要涵盖。我强烈推荐曼宁的书《蚂蚁在行动》,书中有一整章是关于常春藤的。


答案 2

David给出了一个非常好的答案,但我想指出,taskdef不是必需的。如果常春藤.jar位于预期位置,则 ANT 文件顶部的命名空间声明就足够了:

<project ..... xmlns:ivy="antlib:org.apache.ivy.ant">

有关更多详细信息,我建议阅读有关ANT库如何工作的信息。

以下答案提供了更多“设置常春藤”的建议:


推荐