【问题标题】:Maven: Resolve dependencies using container dependencies firstMaven:首先使用容器依赖解决依赖关系
【发布时间】:2019-04-27 19:42:04
【问题描述】:

我有一个plugin project,它作为依赖项添加到其他container projects

现在,这个插件项目使用了许多常见的依赖项,例如 spring-security、commons-lang 等。

通常,容器项目包含它们自己版本的此类频繁依赖项。因此,当我们添加插件依赖项时,会出现冲突,并且依赖项会根据常规的 maven dependency resolver 以及插件项目依赖项中提供的 scopesoptional 标签来解决。

有没有一种方法可以首先使用父依赖项中的版本解决所有依赖项,如果它们不可用,则使用插件依赖项中指定的版本。

注意:可选和作用域运行时存在一个问题,即这些依赖项是由容器提供的,因此无法提供轻松的单一依赖项来添加插件依赖项。

【问题讨论】:

  • 据我了解,您构建了一次插件并将其添加到容器项目中?那么容器项目(poms)是插件特定的吗?还是反过来,你为每个容器使用自己的 pom 构建插件?
  • 构建一次插件并将其添加到容器项目中
  • 为什么范围:提供的不适用于您。如果您需要针对特定​​模块的其他工件,则无论如何都需要调整每个容器。使用插件项目中提供的范围,您可以添加必要的内容,如有必要,并在必要的版本中。
  • 现在我正在使用范围提供。这种方法的问题是容器/项目必须在他们的项目中明确提供这些(在我的情况下大约 20 个)jar。
  • 您是否已经在使用 来定义版本?在这种情况下,至少您可以覆盖容器项目与容器共享的组件的版本。

标签: java maven dependencies dependency-management


【解决方案1】:

在您的插件 pom 中,将依赖项的版本定义为您知道插件能够使用的版本范围。如果容器依赖项重叠,则将使用它。如果无法找到容器和插件都需要的依赖项的重叠版本,则会产生错误,因为协商失败。 对依赖项不使用特殊范围,因为您希望在必要时将它们包含到容器中,

见:

https://maven.apache.org/enforcer/enforcer-rules/versionRanges.html

还有:

https://books.sonatype.com/mvnref-book/reference/pom-relationships-sect-project-dependencies.html#pom-relationships-sect-version-ranges

【讨论】:

  • 所以,如果我提到我有一个版本> 1.4的junit的依赖项,并且父级没有这个jar的依赖项。使用最新的可用junit它仍然会给出错误或解决吗?
  • 如果您不使用提供的范围,它将使用您在 plugin-pom 中定义的最年轻的依赖项。但请注意 maven 存储库中的快照。这最适用于依赖于您不自己开发的工件,或者您需要明确过滤掉快照。
  • 刚刚完成测试。效果很好。
【解决方案2】:

假设您的容器和插件项目使用相同的父 pom,您可以利用父级中的 <dependencyManagement> 部分来定义公共工件。这允许您省略插件<dependencies> 部分中的版本。

父母:

 <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>group-a</groupId>
        <artifactId>artifact-a</artifactId>
        <version>1.0</version>
      </dependency>
    </dependencies>
 </dependencyManagement>

插件/模块:

    <dependencies>
      <dependency>
        <groupId>group-a</groupId>
        <artifactId>artifact-a</artifactId>
      </dependency>
    </dependencies>

更多详情请参阅https://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html

【讨论】:

  • 这是一种非常好的方法,也是我们管理产品项目的方式。不幸的是,我的插件项目不是父项目的一部分。我的意图是将插件项目中的所有依赖项作为备份。因此,只有当父/容器项目中没有依赖版本时,才会从我的插件项目中获取依赖版本。我希望这是有道理的。
  • 我不确定我是否理解正确。所以你可以在容器项目中使用共享父级吗?如果是这种情况,您可以使用指出的方法并仅指定工件的版本,而不是插件 pom.xml 中父级的dependencyManagement 部分的一部分。
  • 这个插件项目是单独开发的。所以它不是父项目层次结构的一部分,也不包括父 pom。
【解决方案3】:

您可以在构建插件项目并添加对 maven 的依赖项时排除它。 这是一个例子。由于日志库,依赖项和主项目发生冲突。下面是在依赖项目中排除log4j。

<dependency>
        <groupId>org.apache.zookeeper</groupId>
        <artifactId>zookeeper</artifactId>
        <version>${zk.version}</version>
        <exclusions>
            <exclusion>
                <groupId>log4j</groupId>
                <artifactId>log4j</artifactId>
            </exclusion>
        </exclusions>
    </dependency>

P/S:从我的 cmets 添加: 我还开发了一个与您的架构相似的系统。我将这个系统分为 3 个主要部分:1. 包含公共代码和所需 maven 依赖项的 Commons,2. 主项目,3. 插件项目。你可以参考这个。

【讨论】:

  • 我的插件项目包含 15-20 个这样的依赖项。排除他们,一一会炸掉他们的 pom.xml。
  • 我还开发了一个与您的架构相似的系统。我将这个系统分为 3 个主要部分:1. Commons,其中包含公共代码和所需的 Maven 依赖项,2. 主项目,3. 插件项目。你可以参考这个。
  • 因此,我的容器项目在添加插件依赖项时必须排除 15 个依赖项。我知道这个解决方案。我正在寻找一个解决方案(如果可能的话),容器不必排除依赖项。
  • 查看此链接,我的解决方案是第二个。 dzone.com/articles/solving-dependency-conflicts-in-maven
  • 我已经通过这个链接。它涵盖了如何捕获依赖冲突,而不是如何始终使用容器版本解决冲突。
猜你喜欢
  • 2015-11-09
  • 1970-01-01
  • 1970-01-01
  • 2021-08-27
  • 1970-01-01
  • 2019-12-14
  • 2017-07-04
相关资源
最近更新 更多