我们正在从蚂蚁w/w/vy移动到maven。作为此举的一部分,我们将使用多个罐子的项目带入了带有分类器的Maven文物中。
。新的Maven项目对此没有任何问题。但是,我们的常春藤项目无法找到分类器的pom.xml
。
在我们的Maven存储库中,它们是项目中所有罐子的单个pom.xml
:
http://repo.vegicorp.com/l/com/vegicorp/foo/1.0.0/foo-1.0.0.pom
http://repo.vegicorp.com/l/com/vegicorp/foo/1.0.0/foo-1.0.0.jar
http://repo.vegicorp.com/l/com/vegicorp/foo/1.0.0/foo-1.0.0-client.jar
http://repo.vegicorp.com/l/com/vegicorp/foo/1.0.0/foo-1.0.0-test.jar
查看调试蚂蚁构建的输出,我看到它在我们的maven存储库中查看:
http://repo.vegicorp.com/com/vegicorp/foo/1.0.0/foo-1.0.0-client.pom
它将分类器附加到pom.xml
文件的名称!它可以找到并下载罐子,但是如果没有pom.xml
,就无法弄清楚这些依赖关系。我们的构建失败是因为依赖项未下载。
我假设ivysettings.xml
中有一些设置,可以让Ivy知道POM文件没有附加分类器,但我还没有弄清楚。
那么,如何解决此问题?我可能能够将缺少的pom.xml
复制到我们的存储库中(这是文物),但是我不确定是否可以。(也许有伪像的设置可以帮助解决这个问题?)。
您需要对Ivy说使用LBIBLIO解析器。您可以禁用查找POMS,引用Lbilbio链接:
使用M2Compatible Flag时,您可以通过 将USEPOMS标志设置为false
如果一个不起作用,则可以使用Packager Resolver实现更精致的设置 - 在页面的底部,分类器属性上没有一个。
此外(对于任何解析器),您可能需要正确设置工件模式才能实际找到工件。
我已经找到了工作,也许这是我应该一直这样做的方式。
我以这种方式定义了我的 ivy.xml
文件中的依赖项:
<dependency org="com.vegicorp" name="foo" version="1.0"
conf="compile->default"/>
一切都在<dependency>
实体下,没有子本地,而且效果很好。默认情况下,它找到了pom.xml
,将其转换为ivy.xml
依赖项文件,并也下载了JAR。
当我们开始添加分类器时,我们这样做了:
<dependency org="com.vegicorp" name="foo" version="1.0"
conf="compile->default" maven:classifier="client"/>
再次将所有内容都放入<dependency>
实体中,没有子本地。然后,常春藤在com/vegicorp/foo/1.0.0/foo-1.0.0-client.jar
上寻找罐子,这是正确的,但无法在com/vegicorp/foo/1.0.0/foo-1.0.0-client.com
处找到POM。我们以前从未注意到这一点,因为我们只有两个或三个第三方罐有分类器,而且这些罐子都没有对其他罐子的依赖。没有相关的POM下载的罐子没关系。
当我们开始用分类器定义自己的罐子时,一切都破裂了,因为我们的罐子具有其他罐子依赖性。
但是,如果我使用了<artifact>
实体并将分类器放在其中,则一切都起作用:
<dependency org="com.vegicorp" name="foo" version="1.0"
conf="compile->default">
<artifact name="foo" ext="jar" maven:classifier="client"/>
</dependency>
IVY在com/vegicorp/foo/1.0.0
的存储库中找到正确的位置,然后在com/vegicorp/foo/1.0.0/foo-1.0.0.pom
上下载没有分类器的POM。然后,它在com/vegicorp/foo/1.0.0/foo-1.0.0-client.jar