常春藤/ Maven解决:不要拉过传递的“提供”罐子

时间:2012-07-20 21:06:30

标签: ivy artifactory

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

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

有了这个罐子,我也是一堆战争。我将common-all.jar指定为我的依赖项的一部分,common-all.jar所需的30个广告也被删除。一切都很好。

问题在于我建立战争。我不希望将JBoss罐子或log4j罐子作为战争的一部分包括在内。这些将由环境提供。我在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>

1 个答案:

答案 0 :(得分: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>