常春藤不使用分类器拉动对 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"/>

一切都在&lt;dependency&gt; 实体下,没有子实体,它工作得很好。默认情况下,它找到pom.xml,将其转换为ivy.xml依赖文件,并下载jar。

当我们开始添加分类器时,我们是这样做的:

<dependency org="com.vegicorp" name="foo" version="1.0"
    conf="compile->default" maven:classifier="client"/>

再次,将所有内容都放在&lt;dependency&gt; 实体中,不包含子实体。 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 依赖项。

但是,如果我使用 &lt;artifact&gt; 实体并将分类器放入其中,一切正常:

<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 的传递依赖的主要内容,如果未能解决你的问题,请参考以下文章

Gradle:通过版本分类器覆盖传递依赖

在 Zeppelin 中使用分类器指定依赖关系

常春藤解决某些用户失败

如何使用不同的分类器在 Ivy 中下载多个 Maven 依赖项?

19贝叶斯分类器:半朴素贝叶斯分类器(属性之间存在依赖)

如何减去常春藤依赖集