Ivy/Maven 解决 : Don't pull transitive "provided" jars

标签 ivy artifactory

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

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

有了这个Jar,我也战了一堆。我指定 common-all.jar作为我依赖的一部分,以及 common-all.jar 的 30 个 jar 要求也被拉低了。一切都很好。

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

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

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

我如何指定 common-all.jar需要某些特定的 jar 进行编译,但是当我在 war 中构建它时,我不想要所有这些 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>

最佳答案

您还没有演示如何声明 common-all 依赖关系,所以我将编写以下示例:

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

神奇的是配置映射:

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

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

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

关于Ivy/Maven 解决 : Don't pull transitive "provided" jars,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11586945/

相关文章:

java - ivy.xml以及如何配置

java - Artifactory 如何管理 Ivy 描述符

sbt:将插件发布到本地仓库并从本地仓库解析

gradle - 由于快照/发布处理策略,无法解析来自 Artifactory 的快照

android - 如何发布android Apk到Jfrog artifactory

ant - 将本地 jar 添加到 ivy 构建脚本中

unit-testing - 如何使用 Ivy 构建和单元测试?

java - teamcity如何自动推送jar到Artifactory

jenkins - 管理二进制 dll 文件(嵌入式 C/C++ 项目 Artifactory )并与 Jenkins 集成的存储库管理器

python - conda 可以配置为使用私有(private) pypi 存储库吗?