Maven:首先使用容器依赖关系解决依赖关系

Maven: Resolve dependencies using container dependencies first

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

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

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

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

注意:optional 和 scope runtime 存在一个问题,即这些依赖项是由容器提供的,因此违背了提供简单的单一依赖项以添加插件依赖项的目标。

你可以在构建插件项目时排除它,并添加对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:根据我的评论添加: 我还开发了一个与您的架构相似的系统。我将这个系统分为 3 个主要部分:1. Commons,其中包含公共代码和所需的 Maven 依赖项,2. 主项目,3. 插件项目。你可以参考这个。

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

parent:

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

plugin/module:

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

有关详细信息,请参阅 https://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html

在您的插件 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