Maven:首先使用容器依赖项来解决依赖项

时间:2018-11-26 07:25:59

标签: java maven dependencies dependency-management

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

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

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

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

注意:可选和作用域运行时存在一个问题,即这些依赖关系是由容器提供的,因此超出了提供无忧的单一依赖关系以添加插件依赖关系的目的。

3 个答案:

答案 0 :(得分:1)

假设您的容器和插件项目使用相同的父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

答案 1 :(得分: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

答案 2 :(得分:0)

在构建插件项目并向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。Main项目; 3。Plugin项目。您可以参考这个。