2015-03-31 225 views
1

我无法通过配置名称检索我期望的依赖关系。我有一个共享库,我发布到本地存储库,使用以下常青藤文件:常春藤解决其他配置中的依赖关系

<?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的东西的依赖关系时,麻烦就开始了。我用这个ivy文件:

<?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罐子,log4jmy-module,我得到12瓶,其中包括activation.jarmail.jar,事情我不明白当我使用第一个常春藤文件来检索。为什么我的第二个常青藤文件将所有内容都拉入运行时配置中?我究竟做错了什么?

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

回答

2

我觉得你的问题是你如何声明的发表文物的配置:

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

你基本上说他们应该是“运行”的一部分,“规定”和“测试”配置。此外,因为3个配置是嵌套的,“运行时”中的某些内容也将自动成为“提供”和“测试”的一部分。

所以我建议重组你的ivy文件如下:

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

注:

也被包含在“默认”配置
  • 主要人工制品是一个独立的“主”配置
  • “来源”的其他配置。保持与运行时隔离,并允许它明确下载
  • “提供”范围是独立的。这一点很重要,因为您不希望它被意外打包在战争文件中。

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

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

好的,谢谢。这解决了我的问题。 – 2015-04-06 13:40:24

+0

其他的东西是我的问题的一部分 - 如果您不更新发布版本,缓存不会更新。所以清除缓存也是必要的。 – 2015-04-09 12:51:32

+0

@DavidStanley啊...那么这就是缓存的目的....我通过使用非常有用的ivy buildnumber任务来每次发布工件时生成唯一的版本号,从而避免了这个问题。参见:http://ant.apache.org/ivy/history/latest-milestone/use/buildnumber.html – 2015-04-09 20:31:52

相关问题