3

我在我的项目中使用 Ivy,但我们使用 Artifactory 作为我们的 jar 存储库。我实际上使用<ivy:makepom>Ant 任务来创建 Maven pom.xml,因此我可以通过 Maven deploy:deploy 工作流将 jars 和 war 部署回我的 Maven 存储库。

我构建了一个名为的大 jar common-all.jar,它的编译需要大约 30 个 jar。我指定了大约 10 个 jar,Ivy 拉下依赖项。作为编译过程的一部分,我指定了 log4j jar 和一些 JBoss jar。当然,这些罐子将由我们的环境提供。

有了这个Jar,我也打了一堆。我将 指定common-all.jar为我的依赖项的一部分,并且common-all.jar需要的 30 个罐子也被拉下。一切都很好。

问题是当我建立战争时。我不希望将 JBoss jar 或 log4j jar 作为战争的一部分。这些将由环境提供。我已将它们标记为pom.xml 文件中提供的内容。当我建立common-all.jar.

现在,问题是我如何在编译战争代码时指定我想要这些,但我不想将它们包含在我的战争本身中。

这是我的ivy.xml文件示例。

如何指定common-all.jar编译需要某些特定的 jar,但是当我在战争中构建它时,我不想要所有这些 jar

<ivy-module version="1.0">
    <info
        organisation="com.travelclick"
        module="TC-AppUtil"
        revision="4.1"
        status="release"/>

    <configurations>
        <conf name="default" visibility="public"
            description="The single built artifact. Nothing else"/>

        <conf name="compile" visibility="public"
            description="The master module and transitive dependencies"/>

        <conf name="provided" visibility="public"
            description="Needed for compile. Will be provided outside or war"/>

        <conf name="runtime" visibility="public"
            description="Not required for compile, but for runtime"
            extends="compile"/>

        <conf name="default" visibility="public"
            description="The default configuration"
            extends="runtime"/>

        <conf name="test" visibility="private"
            description="Required for testing" extends="runtime"/>

    </configurations>
    <dependencies>

        <!-- Normal Compile Dependencies -->

        <dependency org="ximpleware" name="vtd-xml"
            rev="2.5" conf="compile->default"/>

        <dependency org="com.travelclick" name="common-all"
            rev="4.1" conf="compile->compile,runtime"/>

        <!-- Testing -->

        <dependency org="junit"             name="junit"
            rev="4.10"                      conf="test->default"/>
    </dependencies>
</ivy-module>
4

1 回答 1

3

您还没有演示如何声明 common-all 依赖项,因此我将组成以下示例:

<dependency org="mygroup" name="common-all" rev="1.0" conf="compile->default;provided"/>

神奇的是配置映射:

  • 本地“编译”配置映射到公共模块及其默认(编译)范围依赖项,并且
  • 本地“提供”配置映射到公共模块及其提供的范围依赖项。

在您的构建文件中,配置使用如下:

<project name="demo" default="build" xmlns:ivy="antlib:org.apache.ivy.ant">

    <target name="resolve">
        <ivy:resolve/>
        <ivy:cachepath pathid="compile.path"  conf="compile"/>
        <ivy:cachepath pathid="provided.path" conf="provided"/>
    </target>

    <target name="compile" depends="resolve">
        <javac ...
            <classpath>
                <path refid="compile.path"/>
                <path refid="provide.path"/>
            </classpath>
        </javac>

    </target>

    <target name="build" depends="compile">
        <ivy:retrieve pattern="build/lib/[artifact].[ext]" conf="runtime"/>

        <war ...
            <lib dir="build/lib"/>
        </war>
    </target>

    <target name="clean">
        <delete dir="build"/>
        <ivy:cleancache/>
    </target>

</project>
于 2012-07-22T21:53:41.200 回答