2015-03-31 282 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

相關問題