【问题标题】:Maven/Ivy: Identical artifact with different name in dependencyMaven/Ivy:依赖项具有不同名称的相同工件
【发布时间】:2011-02-15 07:58:53
【问题描述】:

目前我正在使用 Ivy 进行依赖管理。由于传递依赖,我经常遇到获取具有不同名称的相同 jar 文件的问题。

例子:

<dependency>
    <groupId>javax.mail</groupId>
    <artifactId>mail</artifactId>
    <version>1.4</version>
</dependency>

<dependency>
    <groupId>org.apache.geronimo.specs</groupId>
    <artifactId>geronimo-javamail_1.4_spec</artifactId>
    <version>1.4</version>
</dependency>

我也在考虑试用 Maven。

在 Ivy 或 Maven 中消除这些相同工件的任何最佳实践?

【问题讨论】:

    标签: maven-2 ivy


    【解决方案1】:

    Global exclusion of artifacts 将是处理这种情况的一个很好的功能 - 相同的工件具有不同的名称 - 直到 Maven 提供更好的方法来处理“Specs JAR”又名Virtual Dependencies

    不幸的是,这样的功能目前不可用(请参阅MNG-3196MNG-1977),因此您必须声明dependency exclusions 以将不需要的工件从可传递的依赖项中排除。在 Maven 中,这是通过在 pom 的 &lt;dependency&gt; 部分下添加 &lt;exclusions&gt; 标签来完成的。

    <project>
      ...
      <dependencies>
        <dependency>
          <groupId>sample.ProjectA</groupId>
          <artifactId>Project-A</artifactId>
          <version>1.0</version>
          <scope>compile</scope>
          <exclusions>
            <exclusion>  <!-- declare the exclusion here -->
              <groupId>sample.ProjectB</groupId>
              <artifactId>Project-B</artifactId>
            </exclusion>
          </exclusions> 
        </dependency>
      </dependencies>
    </project>
    

    如果所有项目都使用Project-A-1.0.jar,一种可能的解决方案是在公司POM 的dependencyManagement 部分下声明这一点,以免重复。

    【讨论】:

    • 感谢指点,我发现Ivy其实支持global exclusion
    • @ThiamTeck Ahh,来自 Ivy 的好人(我更喜欢 Maven,不知道这一点)。感谢您的反馈。
    【解决方案2】:

    在这个特定的例子中,我会选择 javax 的。如果您有不同名称的工件,您可以在 Maven 中使用排除项。我不知道这在 Ivy 中是否可行。

    【讨论】:

    • 是的,在 Ivy 中可以排除。但我想寻找一个替代解决方案,这样我和我的同事就不需要在每个项目中重复这些排除。目前我正在考虑设置一个 Maven 存储库管理器(使用 Nexus),但不确定这是否会有所帮助。
    • 在父 pom 中定义一个 dependencyManagement 部分,将其部署到您的 Nexus 并且任何其他同事都可以使用它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-26
    • 1970-01-01
    • 2015-07-15
    • 1970-01-01
    • 2018-01-07
    • 1970-01-01
    • 2019-11-19
    相关资源
    最近更新 更多