在maven中,對于一個(gè)依賴,除了groupId,artifactId,version這三個(gè)屬性來作為標(biāo)志之外,還有一個(gè)特殊的屬性可用: classifier。
以下面的testng的為例:
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>5.10</version>
<classifier>jdk15</classifier>
</dependency>
ivy中依賴對應(yīng)的有屬性org,name,rev,分別對應(yīng)到maven中的groupId,artifactId,version.
<dependency org="org.testng" name="testng" rev="5.10" />
但是ivy中沒有和maven的classifier屬性相對應(yīng)的屬性,因此無法表示classifier。這樣就造成一些問題,比如上面的testng的例子,在ivy中如果將對testng的依賴定義寫成上面的樣子,則解析時(shí)是無法獲取到我們想到的依賴 testng-5.10.jar的,從而造成解析失敗:
[ivy:resolve] :: problems summary ::
[ivy:resolve] :::: WARNINGS
[ivy:resolve] [FAILED ] org.testng#testng;5.10!testng.jar: (0ms)
[ivy:resolve] ==== shared: tried
[ivy:resolve] G:\workspace\study\java\tools\ivy\skyMailDemo\skyMail\ivy\setup\DepositorySetup\userdir/shared/org.testng/testng/5.10/jars/testng.jar
[ivy:resolve] ==== public: tried
[ivy:resolve] http://192.168.0.30:8081/nexus/content/groups/public/org/testng/testng/5.10/testng-5.10.jar
[ivy:resolve] ::::::::::::::::::::::::::::::::::::::::::::::
[ivy:resolve] :: FAILED DOWNLOADS ::
[ivy:resolve] :: ^ see resolution messages for details ^ ::
[ivy:resolve] ::::::::::::::::::::::::::::::::::::::::::::::
[ivy:resolve] :: org.testng#testng;5.10!testng.jar
[ivy:resolve] ::::::::::::::::::::::::::::::::::::::::::::::
我們可以看一下maven倉庫中testng是如何保存的,首先看maven2的官方倉庫:
http://repo1.maven.org/maven2/org/testng/testng/5.10/
testng-5.10-jdk14.jar 06-Aug-2009 18:22 1002817
testng-5.10-jdk14.jar.md5 06-Aug-2009 18:25 128
testng-5.10-jdk14.jar.sha1 06-Aug-2009 18:25 136
testng-5.10-jdk15.jar 06-Aug-2009 18:22 871404
testng-5.10-jdk15.jar.md5 06-Aug-2009 18:25 128
testng-5.10-jdk15.jar.sha1 06-Aug-2009 18:25 136
testng-5.10-sources.jar 06-Aug-2009 18:23 339279
testng-5.10-sources.jar.md5 06-Aug-2009 18:23 130
testng-5.10-sources.jar.sha1 06-Aug-2009 18:23 138
testng-5.10.pom 06-Aug-2009 18:23 2115
testng-5.10.pom.md5 06-Aug-2009 18:23 122
testng-5.10.pom.sha1 06-Aug-2009 18:23 130
然后再看一下ivy官方提供的maven2倉庫
http://mirrors.ibiblio.org/pub/mirrors/maven2/org/testng/testng/5.10/
testng-5.10-jdk14.jar 06-Aug-2009 14:22 1.0M
testng-5.10-jdk14.jar.md5 06-Aug-2009 14:25 128
testng-5.10-jdk14.jar.sha1 06-Aug-2009 14:25 136
testng-5.10-jdk15.jar 06-Aug-2009 14:22 851K
testng-5.10-jdk15.jar.md5 06-Aug-2009 14:25 128
testng-5.10-jdk15.jar.sha1 06-Aug-2009 14:25 136
testng-5.10-sources.jar 06-Aug-2009 14:23 331K
testng-5.10-sources.jar.md5 06-Aug-2009 14:23 130
testng-5.10-sources.jar.sha1 06-Aug-2009 14:23 138
testng-5.10.pom 06-Aug-2009 14:23 2.1K
testng-5.10.pom.md5 06-Aug-2009 14:23 122
testng-5.10.pom.sha1 06-Aug-2009 14:23 130
我們會(huì)發(fā)現(xiàn),根本不存在testng-5.10.jar 這樣的制品,而是有testng-5.10-jdk14.jar 和testng-5.10-jdk15.jar,即必須明確給出classifier屬性以確定制品名稱并下載。
那么,在ivy中如何指定classifier屬性呢?
首先檢查ivy的文檔,看在ivy.xml中的dependency 元素上是否有對應(yīng)的可用的屬性,結(jié)果發(fā)現(xiàn)沒有。隨即祭出google大法,終于在ivy官網(wǎng)的JIRA系統(tǒng)中找到了對這個(gè)問題的處理方式(請留意粗體加下劃線的內(nèi)容):
1. 修改ivy.xml文件
增加xmlns:m的namspace定義
<ivy-module version="2.0" xmlns:m="http://ant.apache.org/ivy/maven">
在需要制定classifier的依賴上使用屬性m:classifier
<dependency org="org.testng" name="testng" rev="5.10" m:classifier="jdk15" />
2. 修改ivysettings,在pattern中增加對classifier的支持
<resolvers>
<ibiblio name="public" m2compatible="true" root="http://192.168.0.30:8081/nexus/content/groups/public/" pattern="[organisation]/[module]/[revision]/[artifact]-[revision](-[classifier]).[ext]"/>
</resolvers>