我为这篇文章的长度表示歉意,但我在不展示图片的情况下无法使其更简洁。我最近接手了一个 maven 3.0 多模块项目的 build-master 工作。问题是项目/模块的结构是一场灾难。从当前存储在源代码控制中的方式(我们使用 RTC)到模块的 pom 结构,我都在竭尽全力尝试每次都完成一个完整的构建周期。
作为项目层次结构,所有模块都“扁平”存储;即:一切都在同一水平。我有一个父 pom,所有模块都依赖于父级。但是,父级与我的所有其他模块处于同一级别。
前任:
c:\dev\MyEarProject
+ parent-pom
- pom.xml
+ module1
- pom.xml (depends on parent-pom)
- src
- main
- ...
+ module2
- pom.xml (depends on parent-pom)
- src
- main
- ...
+ module3
- pom.xml (depends on parent-pom)
- src
- main
- ...
父 pom 定义了构建项目所需的所有模块,以及在不同子模块中使用的工件版本号的一堆属性:
<modules>
<module>../module1</module>
<module>../module2</module>
<module>../module3</module>
</modules>
<properties>
<org.springframework.version>3.0.5.RELEASE</org.springframework.version>
<slf4j.version>1.6.4</slf4j.version>
<repositoryAddress>${snapshots.repo.url}</repositoryAddress>
<my.hibernate-module.dao.impl>1.2.3</my.hibernate-module.dao.impl>
<my.hibernate-module.dao.api>1.2.3</my.hibernate-module.dao.api>
</properties>
反过来,每个模块的 pom 通过 pom 的工件编号依赖于父 pom:
<parent>
<groupId>com.cws.cs.lendingsimulationservice</groupId>
<artifactId>parent-pom</artifactId>
<version>1.0.6</version>
</parent>
更令人困惑的是,实际的工件名称可能(取决于模块)与模块路径匹配,也可能不匹配。例如, module1 可能位于 path 中c:\dev\MyEarProject\module1
,但具有 artifact name hibernate-module
。但是,由于它在 RTC 中的存储方式,在module1
签出时会调用该目录。
当然,构建一切的最简单方法是进入c:\dev\MyEarProject\parent-pom\
并运行mvn clean deploy
. 这在 SNAPSHOT 模式下工作正常,因为 SNAPSHOT 存储库允许同一工件版本的多个部署。但是在发布模式下,这会失败。
这种结构给我带来了两个问题。
- 每次我需要对父级中的属性进行版本更改时,我都必须更新父级 pom 版本号,以及所有子模块父级 pom 的版本,以及所有子模块本身的版本(因为父级更改了)。
- 每当我需要部署发布周期时,如果其中一个模块自上一个周期以来没有更改并且因此无法重新部署到同一个 repo(repo 不允许覆盖现有工件),mvn 将引发错误
所以我正在寻找重组这个项目以避免这些问题的最佳方法。对于父 pom,我知道我可以使用相对路径来指向父级。但是,鉴于模块的“扁平”结构,这是一种推荐的方法吗(即:父 pom 相对路径将是 ../parent-pom/pom.xml - 对我来说似乎有点奇怪)?此外,鉴于父级的版本控制独立于模块,使用相对路径不仅会导致额外的混乱(即:无法知道父级 pom 的哪个版本与哪个版本相关联子模块)。
其次,如何在不遇到部署错误的情况下构建整个耳朵?由于工件已经存在于 repo 中,我不需要重建和重新部署它。我尝试使用 --projects 但由于涉及的模块数量众多,管理起来非常困难。