在maven中,对于一个依赖,除了groupId,artifactId,version这三个属性来作为标志之外,还有一个特殊的属性可用: classifier。
以下面的testng的为例:
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>5.10</version>
<classifier>jdk15</classifier>
</dependency>
ivy中依赖对应的有属性org,name,rev,分别对应到maven中的groupId,artifactId,version.
<dependency org="org.testng" name="testng" rev="5.10" />
但是ivy中没有和maven的classifier属性相对应的属性,因此无法表示classifier。这样就造成一些问题,比如上面的testng的例子,在ivy中如果将对testng的依赖定义写成上面的样子,则解析时是无法获取到我们想到的依赖 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
我们会发现,根本不存在testng-5.10.jar 这样的制品,而是有testng-5.10-jdk14.jar 和testng-5.10-jdk15.jar,即必须明确给出classifier属性以确定制品名称并下载。
那么,在ivy中如何指定classifier属性呢?
首先检查ivy的文档,看在ivy.xml中的dependency 元素上是否有对应的可用的属性,结果发现没有。随即祭出google大法,终于在ivy官网的JIRA系统中找到了对这个问题的处理方式(请留意粗体加下划线的内容):
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>