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”(在开发期间):
<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,即无需更改。
- 需要更新parent以反映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更新为引用parent: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。 =>恶性循环。
(注意:这里使用的构件名称仅为简化起见.)