Ale*_*der 6 maven maven-enforcer-plugin maven-dependency
我们的团队有多个项目;大多数项目只是库。为简单起见,让我们假设这些库不相互依赖,并且有一个使用它们的项目,例如:
Project Main:
Project Lib-A:
X (3rd-party library)
Project Lib-B:
X (3rd-party library)
Run Code Online (Sandbox Code Playgroud)
为了避免在“Main”中出现意外,我们希望确保我们自己的所有项目都使用相同版本的第 3 方库,以便例如构建“Lib-A”和“Lib-B”使用相同版本的库 X 进行测试。
为了实现这一点,我们使用了一个父 pom,其中包含<dependencyManagement>详细说明所有相关 3rd-party 库的版本及其传递依赖项的部分。这个父 pom 被所有项目继承,即上面示例中的“Main”、“Lib-A”和“Lib-B”。然后每个子 pom 只会使用<dependency>而不指定任何版本。我们还有Maven 执行器插件的依赖收敛规则,以确保我们没有错过任何项目中的任何库冲突。
问题:增加 X 的版本:'Lib-A' 的开发者将 X 的版本从 1.0 增加到 2.0。因此,他更改了父 pom 中 X 的版本,增加了父 pom 的版本,释放了父 pom,并通知来自“Main”的人他们现在应该使用新的父 pom。情况变成这样:
Main - inherits from Parent:2.0 and depends on:
Lib-A:2.0 - inherits from Parent 2.0 and depends on X:2.0
Lib-B:1.0 - inherits from Parent 1.0 and depends on X:1.0
X:2.0 (taken from Parent:2.0 <dependencyManagement> section)
Run Code Online (Sandbox Code Playgroud)
一切,包括“Main”,构建良好,“maven 执行器插件”没有检测到任何冲突,因为 X 的版本在“Main”继承的 Parent:2.0 中明确指定。所以我们发布'Main'。
噢...。Lib-B 从未使用 X:2.0 构建。它有很好的单元测试可以发现问题,但我们从未尝试过。我们忘记更新 Lib-B,尝试使用 X:2.0 并发布它。'Main' 的构建仍然没有问题,并且 maven 执行器插件从未抱怨过。
问题:我们需要 maven 来检测是否存在从同一工件但不同主要版本继承的依赖项,并且构建失败。
在我们的例子中,构建必须失败,因为 'Main' 和 'Lib-A' 继承自 Parent:2.0,但 'Lib-B' 继承自 Parent:1.0。
到目前为止,我的解决方案(一个 hack):除了继承之外,还向所有输出项目(即“Main”、“Lib-A”和“Lib-B”)添加对父 pom 的显式依赖:
<dependency>
<artifactId>Parent</artifactId>
<type>pom</type>
<version>${project.parent.version}</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
然后使用<bannedDependencies>maven 执行器插件的规则来禁止其他主要的 Parent 版本(<dependencyConvergence/>如果我们想即使在较小的 Parent 版本冲突时也失败,我们也可以使用它的规则)。
在父 pom 的主要版本冲突时,是否有一种不那么笨拙和麻烦的方法来失败?
可能是我们管理 Maven 依赖项的整个方法是错误的,那么推荐的方法是什么?
更新:在放弃之前
,尝试按照@JF Mayer 的建议和此处的描述为 maven-enforcer-plugin 编写我自己的规则。原因:
DependencyGraphBuilder来检测对具有不同主要版本的父代的依赖关系。没门!可以看出,mvn dependency:tree它也使用了此类,DependencyGraphBuilder不提供所有依赖项,因此不能用于检测依赖项冲突。这就是为什么<dependencyConvergence>maven 执行者规则使用了一个DefaultDependencyTreeBuilder甚至已从 GitHub 和其他任何地方删除的超级弃用规则- 对于无故障的自定义解决方案来说,这不是一个好的选择。为了完整起见,我自己的穷人解决方案:
将 pom 类型的显式依赖项添加到每个项目的父级,以便 maven-enforcer-plugin 的<dependencyConvergence>规则可以检测到冲突的父级版本。这没什么大不了的,因为我们只添加此部分一次,然后就忘记它:
<dependency>
<groupId>${project.parent.groupId}</groupId>
<artifactId>${project.parent.artifactId}</artifactId>
<version>${project.parent.version}</version>
<type>pom</type>
</dependency>
Run Code Online (Sandbox Code Playgroud)<dependencyConvergence>即使在父版本(例如 1.0.1 和 1.0.2)中存在“增量”差异,“主”构建也会失败。在这种情况下,“Main”的开发人员可以决定尽管父版本冲突也可以构建它,因为它无关紧要(这是我最初的问题)。mvn -P I-know-what-I-am-doing deploy。我对这个解决方案不太满意,因为第 2 步要求“Main”的开发人员使用特殊的配置文件来构建它,以防父版本冲突。我更喜欢一个总是在主要父版本冲突时失败但自动忽略父 pom 版本中微不足道的差异的解决方案,我只是不知道如何实现这一点。
| 归档时间: |
|
| 查看次数: |
204 次 |
| 最近记录: |