常春藤不使用分类器拉动对 jar 的传递依赖
Posted
技术标签:
【中文标题】常春藤不使用分类器拉动对 jar 的传递依赖【英文标题】:Ivy not pulling transitive dependencies on jars with classifiers 【发布时间】:2017-07-21 00:53:46 【问题描述】:我们正在从带 Ivy 的 Ant 迁移到 Maven。作为这一举措的一部分,我们将具有多个 jar 的项目(过去是单独的 Ivy 工件)放入带有分类器的 Maven 工件中。
新的 Maven 项目对此没有任何问题。但是,我们的 Ivy 项目找不到分类器的 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 文件没有附加分类器,但我还没弄清楚。
那么,我该如何解决这个问题?我也许能够将丢失的pom.xml
复制到我们的存储库(这是 Artifactory),但我不确定我是否可以。 (也许 Artifactory 中有一个设置可以帮助解决这个问题?)。
【问题讨论】:
【参考方案1】:你需要告诉 ivy 才能使用lBiblio resolver。您可以禁用查找 poms,引用 lBilbio 链接:
使用 m2compatible 标志时,您可以通过以下方式禁用 pom 将 usepoms 标志设置为 false
如果那个不起作用,可以使用packager resolver 实现更精细的设置 - 在页面底部有一个 not on 分类器属性。
此外(对于任何解析器),您可能需要正确设置工件模式才能真正找到工件。
【讨论】:
我正在使用 IBIBILO 解析器。我不想禁用 pom 的使用,因为我需要它们来查找我正在下载的 jar 的依赖项。我会尝试设置打包解析器。 我遇到了打包解析器的问题。我可以让它看到分类器或不看到分类器,所以我可以选择找到 POM 或 JAR。 Grr.【参考方案2】:我找到了一个解决方法,或者也许这就是我应该一直这样做的方式。
我以这种方式在我的 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。我们以前从未注意到这一点,因为我们只有两三个具有分类器的第三方 jar,而且这些 jar 都没有依赖于其他 jar。 jar 下载没有相关的 POM 并不重要。
当我们开始使用分类器定义自己的 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
【讨论】:
以上是关于常春藤不使用分类器拉动对 jar 的传递依赖的主要内容,如果未能解决你的问题,请参考以下文章