【问题标题】:Ivy Resolves Dependencies In Other ConfigurationsIvy 解决其他配置中的依赖关系
【发布时间】:2015-06-04 23:21:03
【问题描述】:

我无法通过配置名称检索我期望的依赖项。我有一个共享库,我正在使用以下 ivy 文件发布到本地存储库:

<?xml version="1.0"?>
<ivy-module version="2.0">
    <info organisation="my.org" module="my-stuff" status="release"/>
    <configurations>
        <conf name="runtime"/>
        <conf name="provided" extends="runtime"/>
        <conf name="test"     extends="provided"/>
    </configurations>
    <publications>
        <artifact name="my-stuff" type="jar"    ext="jar" conf="*"/>
        <artifact name="my-stuff" type="source" ext="zip" conf="*"/>
    </publications>
    <dependencies>
        <dependency org="javax.servlet"     name="servlet-api" rev="2.4"    conf="provided,test -> master"/>
        <dependency org="org.apache.tomcat" name="tomcat-dbcp" rev="7.0.47" conf="provided,test -> master"/>
        <dependency org="log4j"             name="log4j"       rev="1.2.17" conf="* -> master"/>
        <dependency org="my.org"            name="my-module"   rev="1.2.3"  conf="* -> default"/>
        <dependency org="junit"             name="junit"       rev="4.5"    conf="provided,test -> master"/>
        <dependency org="org.apache.ant"    name="ant"         rev="1.8.4"  conf="provided,test -> master"/>
    </dependencies>
</ivy-module>

到目前为止,一切都很好。我发布了my-stuff jar,如果我尝试通过配置检索它的依赖项,我会得到我所期望的,运行时配置中有两个依赖项,提供和测试配置中各有六个。当我尝试检索依赖于my-stuff 的东西时,麻烦就开始了。我使用这个常春藤文件:

<?xml version="1.0"?>
<ivy-module version="2.0">
    <info organisation="my.org" module="test-my-stuff" status="release"/>
    <configurations>
        <conf name="runtime"/>
        <conf name="provided" extends="runtime"/>
        <conf name="test" extends="provided"/>
    </configurations>
    <dependencies>
        <dependency org="my.org" name="my-stuff" rev="1.1"/>
    </dependencies>
</ivy-module>

现在,如果我尝试检索 runtime 配置,而不是获取 my-stuff jar、log4jmy-module,我会得到 12 个 jar,包括 activation.jarmail.jar,我没有当我使用第一个常春藤文件检索时,我没有得到。为什么我的第二个常春藤文件将所有内容都拉入运行时配置?我到底做错了什么?

另一方面,如果我将配置映射添加到第二个文件中的依赖项,例如runtime-&gt;runtime;provided-&gt;provided;test-&gt;test,则解析将失败,声称找不到my-stuff

【问题讨论】:

    标签: dependency-management ivy


    【解决方案1】:

    我认为您的问题是您如何声明已发布工件的配置:

    <publications>
        <artifact name="my-stuff" type="jar"    ext="jar" conf="*"/>
        <artifact name="my-stuff" type="source" ext="zip" conf="*"/>
    </publications>
    

    您基本上是在说它们应该是“运行时”、“提供”和“测试”配置的一部分。此外,由于这 3 种配置是嵌套的,“运行时”中的某些内容也将自动成为“提供”和“测试”的一部分。

    所以我建议重组你的常春藤文件如下:

    <configurations>
        <conf name="default" extends="runtime,master"/>
        <conf name="master"/>
        <conf name="sources"/>
        <conf name="provided"/>
        <conf name="runtime"/>
        <conf name="test" extends="runtime"/>
    </configurations>
    <publications>
        <artifact name="my-stuff" type="jar"    ext="jar" conf="master"/>
        <artifact name="my-stuff" type="source" ext="zip" conf="sources"/>
    </publications>
    

    注意事项:

    • 主要工件位于独立的“主”配置中,该配置也包含在“默认”配置中
    • “来源”的附加配置。使其与运行时隔离并允许显式下载
    • “提供”范围是独立的。这很重要,因为您不希望它被意外打包到 war 文件中。

    依赖声明现在应该可以工作了,但提供显式配置映射总是一个好主意,在这种情况下是我们新的“默认”配置:

    <dependency org="my.org" name="my-stuff" rev="1.1" conf="runtime->default"/>
    

    【讨论】:

    • 我的问题的一部分 - 如果你不更新你的发布版本,缓存不会得到更新。所以清除缓存也是必要的。
    • @DavidStanley 啊……嗯,这就是缓存的目的……我通过使用非常有用的 ivy buildnumber 任务在每次发布工件时生成唯一的版本号来避免这个问题.见:ant.apache.org/ivy/history/latest-milestone/use/…
    猜你喜欢
    • 2013-02-14
    • 2012-12-24
    • 2017-03-08
    • 2011-12-11
    • 2014-09-19
    • 2016-01-06
    • 2013-02-11
    • 2016-10-11
    • 2019-11-04
    相关资源
    最近更新 更多