我们正从Ant w / Ivy迁移到Maven。作为这一举措的一部分,我们采用了多个罐子的项目,这些罐子将Ivy工件分离为Maven工件和分类器。
新的Maven项目对此没有任何问题。但是,我们的常春藤项目无法找到分类器的pom.xml
。
在我们的Maven存储库中,它们是项目中所有jar的单个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
查看调试Ant构建的输出,我看到它在我们的Maven存储库中查找:
http://repo.vegicorp.com/com/vegicorp/foo/1.0.0/foo-1.0.0-client.pom
它将分类器附加到pom.xml
文件的名称!它可以找到并下载jar,但如果没有pom.xml
,它就无法找出依赖关系。我们的构建失败,因为没有下载依赖项。
我假设ivysettings.xml
中有一些设置会让Ivy知道Pom文件没有附加分类器,但我还没知道。< / p>
那么,我该如何解决这个问题呢?我可能能够将丢失的pom.xml
复制到我们的存储库(这是Artifactory),但我不确定我是否可以。 (也许Artifactory中有一个设置可以帮助解决这个问题吗?)。
答案 0 :(得分:0)
你需要对常春藤说lBiblio resolver。您可以禁用寻找poms,引自lBilbio链接:
使用m2compatible标志时,您可以禁用poms的使用 将usepoms标志设置为false
如果那个不起作用,可以使用packager resolver实现更精细的设置 - 在页面底部有一个不在分类器属性。
此外(对于任何解析器),您可能需要正确设置工件模式以实际查找工件。
答案 1 :(得分:0)
我找到了解决方法,或者这可能是我应该一直这样做的方式。
我用这种方式在我的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>
实体中,不包含子实体。 Ivy然后在com/vegicorp/foo/1.0.0/foo-1.0.0-client.jar
找到正确的jar,但无法在com/vegicorp/foo/1.0.0/foo-1.0.0-client.com
找到POM。我们之前从未注意到这一点,因为我们只有两到三个具有分类器的第三方罐子,而且这些罐子都没有依赖其他罐子。在没有相关POM的情况下下载jar并不重要。
当我们开始使用分类器定义我们自己的jar时,一切都崩溃了,因为我们的jar有其他jar依赖项。
但是,如果我使用<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