【发布时间】:2012-05-14 05:04:32
【问题描述】:
对于这篇文章的长度,我深表歉意,但我在不展示图片的情况下无法使其更简洁。我最近接手了一个 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 可能位于路径c:\dev\MyEarProject\module1,但工件名称为hibernate-module。但是,由于它在 RTC 中的存储方式,该目录在签出时称为module1。
当然,构建一切的最简单方法是进入c:\dev\MyEarProject\parent-pom\ 并运行mvn clean deploy。这在 SNAPSHOT 模式下工作正常,因为 SNAPSHOT 存储库允许同一工件版本的多个部署。但是在发布模式下,这会失败。
这种结构给我带来了 2 个问题。
- 每次我需要对 parent 中的属性进行版本更改时,我都必须更新 parent-pom 版本号,以及所有子模块父 pom 的版本,以及所有子模块本身的版本(因为父更改)。
- 每当我需要部署发布周期时,如果其中一个模块自上一个周期以来没有更改并且因此无法重新部署到同一个 repo(repo 不允许覆盖现有工件),mvn 将引发错误李>
所以我正在寻找重组这个项目以避免这些问题的最佳方法。对于父 pom,我知道我可以使用相对路径来指向父级。但是,鉴于模块的“扁平”结构,这是一种推荐的方法吗(即:父 pom 相对路径将是 ../parent-pom/pom.xml - 对我来说似乎有点奇怪)?此外,鉴于父级的版本控制独立于模块,使用相对路径不仅会导致额外的混乱(即:无法知道父级 pom 的哪个版本与哪个版本相关联子模块)。
其次,如何构建整个耳朵而不会遇到我遇到的部署错误?由于工件已经存在于 repo 中,我不需要重建和重新部署它。我尝试使用 --projects,但由于涉及的模块数量众多,管理起来非常困难。
【问题讨论】:
标签: java maven multi-module maven-deploy-plugin