常春藤解决了其他配置中的依赖关系

时间:2015-03-31 14:54:52

标签: dependency-management 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个广告,包括{{1}和activation.jar,当我使用第一个常春藤文件来检索时,我不会得到的东西。为什么我的第二个常春藤文件将所有内容都拉入运行时配置?我究竟做错了什么?

另一方面,如果我在第二个文件中添加配置映射(例如mail.jar),则解析将失败,声称它无法找到runtime->runtime;provided->provided;test->test

1 个答案:

答案 0 :(得分:2)

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

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