我有一个plugin project
作为依赖项添加到其他container projects
中。
现在,此插件项目使用许多常见的依赖项,例如spring-security,commons-lang等。
通常,容器项目包含自己的此类频繁依赖项版本。因此,当我们添加插件依赖项时,会发生冲突,并且依赖关系会根据常规maven dependency resolver
以及插件项目依赖项中提供的scopes
和optional
标签来解决。
有没有一种方法可以先使用父依赖项中的版本来解决所有依赖项,如果它们不可用,然后使用插件依赖项中指定的版本来解决。
注意:可选和作用域运行时存在一个问题,即这些依赖关系是由容器提供的,因此超出了提供无忧的单一依赖关系以添加插件依赖关系的目的。
答案 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
并且:
答案 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项目。您可以参考这个。