【问题标题】:Ivy not pulling transitive dependencies on jars with classifiers常春藤不使用分类器拉动对 jar 的传递依赖
【发布时间】: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 中有一个设置可以帮助解决这个问题?)。

【问题讨论】:

    标签: jar ant settings ivy


    【解决方案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

    【讨论】:

      猜你喜欢
      • 2010-10-04
      • 2017-08-06
      • 2017-08-13
      • 2017-02-23
      • 2010-11-06
      • 2012-08-05
      • 2011-01-23
      • 2013-10-14
      • 2013-04-26
      相关资源
      最近更新 更多