Maven父POM:循环依赖

亚历山大·穆勒(Alexander Muller)

我们有一个包含约10个工件的模块化项目:

parent
 +- artifact1
 +- artifact2
 +- artifact3
 +- ...
 +- artifact10

此外,某些工件彼此之间具有依赖性:

artifact1
 +-> artifact2
 +-> artifact3
 +-> ...
 +-> artifact10

artifact2
 +-> artifact3

artifact4
 +-> artifact3

artifact4
 +-> artifact5

artifact5
 +-> artifact6

我们当前的设置如下所示:

  • parent是包含父POM的工件。
  • 该父POM在中定义了所有必要的依赖项(例如Spring,JPA等)。
  • 我们所有的工件也都在中定义。
  • 我们的工件将父工件称为-显而易见的父对象。
  • 仅父POM定义版本。所有其他POM都没有。

我们使用具有三个数字的版本控制方案:

<major version>.<minor version>.<patch level>

例如:

0.1.0-SNAPSHOT (a young artifact in development)
0.1.0 (the same artifact once it has been released)
0.1.1 (the same artifact after a hotfix)

问题:

一旦我们更改了工件的版本(例如:0.1.0 => 0.1.1),我们的父工件版本(12.7.3)就需要更新,因为它引用了旧的工件版本(0.1.0)。由于我们在父POM中更改了此引用(0.1.0 => 0.1.1),因此我们也需要增加父POM的版本(12.7.3 => 12.7.4)。现在,我们的工件仍引用先前的父版本(12.7.3),即我们需要再次对其进行更新。

解决这种循环亲子关系的最佳方法是什么?我们可以从父POM中删除我们自己的依赖关系,并在所有其他工件的POM中定义它们的版本,但这意味着一旦依赖关系发生变化,我们将需要更新所有工件。

编辑

包含我们的工件的简化目录结构:

.
├── [api:0.14.0-SNAPSHOT]
│   ├── pom.xml
│   └── src
│       ├── main
│       │   ├── java ...
│       │   └── webapp ...
│       └── test
├── [dao:1.21.0-SNAPSHOT]
│   ├── pom.xml
│   └── src
│       ├── main ...
│       └── test ...
├── [parent:0.11.0-SNAPSHOT]
│   ├── pom.xml
│   └── src
│       ├── main ...
│       └── test ...
├── [pdf-exporter:0.2.0-SNAPSHOT]
│   ├── pom.xml
│   └── src
│       ├── main ...
│       └── test ...
├── [docx-exporter:0.3.0-SNAPSHOT]
│   ├── pom.xml
│   └── src
│       ├── main ...
│       └── test ...
├── [exporter-commons:0.9.0-SNAPSHOT]
│   ├── pom.xml
│   └── src
│       ├── main ...
│       └── test ...
└── [security:0.6.0-SNAPSHOT]
    ├── pom.xml
    └── src
        ├── main ...
        └── test ...

工件目录(在方括号中;以及工件版本)彼此独立,即,为方便起见,它们仅位于公共根目录(“。”)中。每个工件都有其自己的git存储库。“ api”是部署在应用程序服务器上的工件。所有工件都这样引用“父级”(在开发过程中):

<parent>
    <groupId>com.acme</groupId>
    <artifactId>parent</artifactId>
    <version>0.11.0-SNAPSHOT</version>
</parent>

<artifactId>api</artifactId>
<version>0.14.0-SNAPSHOT</version>

场景:

  • exporter-commons更新:0.9.0-SNAPSHOT => 0.9.1-SNAPSHOT。
  • docx-exporter和pdf-exporter引用exporter-commons(无版本),即无需更改。
  • 父项需要更新以反映导出器-公共项的更新:0.11.0-SNAPSHOT => 0.12.0-SNAPSHOT。

问题:api:0.14.0-SNAPSHOT引用了parent:0.11.0-SNAPSHOT。然后将api:0.14.0-SNAPSHOT更新为引用父代:0.12.0-SNAPSHOT。api:0.14.0-SNAPSHOT变为api:0.15.0-SNAPSHOT。但是parent:0.12.0-SNAPSHOT中的pom.xml引用了api:0.14.0-SNAPSHOT。=>恶性循环。

(注意:工件名称是为了简单起见而组成的。)

马里乌斯

建议

为了简化依赖性配置,请使用版本范围

例如,工件A需要B带有version的工件0.1.0将依赖项配置为range <version>[0.1.0, 0.2.0)</version>

这意味着A要求B版本大于或等于0.1.0且小于0.2.0(因此,所有修补程序均适用于此工件)。

这有帮助,因为发布修补程序后,无需更改工件A依赖项。只需重建父项目,修复程序B将附加到项目A

此技术需要在发布修补程序时发布父项目。父项目是指类似WAR的库或EAR,或内部包含所有工件的Distribution Archive。

更多:3.4.3。依赖版本范围

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Maven:如何不依赖于父POM

来自分类Dev

Maven:多个父POM?

来自分类Dev

如何在Maven的继承子依赖项中排除父pom依赖项?

来自分类Dev

Maven依赖树和pom依赖

来自分类Dev

如何防止在子pom中覆盖父pom依赖版本

来自分类Dev

如何跳过Maven插件的父pom执行?

来自分类Dev

父pom中的maven-compiler-plugin

来自分类Dev

Maven“有条件的”父POM?

来自分类Dev

Maven Oracle工件Pom依赖项配置

来自分类Dev

Maven pom.xml中的依赖版本

来自分类Dev

如何使Maven获得发布的父pom而不是最新的pom?

来自分类Dev

Gradle / Maven的循环依赖行为

来自分类Dev

Maven父层次+依赖管理不传递?

来自分类Dev

如何排除来自POM文件中父项的依赖项

来自分类Dev

如何从子pom覆盖Maven 3.0父插件属性

来自分类Dev

Maven父pom具有不同的子版本

来自分类Dev

避免在Maven多模块项目中引用父pom

来自分类Dev

如何从子pom覆盖Maven 3.0父插件属性

来自分类Dev

带有不同子版本的Maven父pom

来自分类Dev

如何将Maven项目与父pom集成为模块?

来自分类Dev

在父pom构建的最后运行docker-maven-plugin

来自分类Dev

如何避免从Maven父POM继承<site>和<url>?

来自分类Dev

Maven 不解析父 pom.xml 文件中的属性

来自分类Dev

Maven- POM.xml中依赖项排序的意义

来自分类Dev

jBPM Maven依赖关系未显示在pom.xml中

来自分类Dev

pom文件中的Maven依赖版本表示法

来自分类Dev

Maven拉入未在POM中指定的依赖项

来自分类Dev

Maven War插件,未从父pom获取依赖项

来自分类Dev

pom.xml中的Maven插件依赖项范围