Maven:首先使用容器依赖关系解决依赖关系
Maven: Resolve dependencies using container dependencies first
我有一个 plugin project
作为依赖添加到其他 container projects
。
现在,这个插件项目使用了许多频繁的依赖项,如 spring-security、commons-lang 等
通常,容器项目包含它们自己的此类频繁依赖项的版本。因此,当我们添加插件依赖项时会发生冲突,依赖项会根据常规 maven dependency resolver
并根据插件项目依赖项中提供的 scopes
和 optional
标签来解决。
有没有办法首先使用父依赖项中的版本解决所有依赖项,如果它们不可用,则使用插件依赖项中指定的版本。
注意: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
并且:
我有一个 plugin project
作为依赖添加到其他 container projects
。
现在,这个插件项目使用了许多频繁的依赖项,如 spring-security、commons-lang 等
通常,容器项目包含它们自己的此类频繁依赖项的版本。因此,当我们添加插件依赖项时会发生冲突,依赖项会根据常规 maven dependency resolver
并根据插件项目依赖项中提供的 scopes
和 optional
标签来解决。
有没有办法首先使用父依赖项中的版本解决所有依赖项,如果它们不可用,则使用插件依赖项中指定的版本。
注意: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
并且: