【发布时间】:2012-02-14 23:09:54
【问题描述】:
我正在考虑重组一个大型 Maven 项目...
我们当前结构的基本概述:
build [MVN plugins, third party dependency management]:5.1
NRW Utils:6.0.0.0-beta12-SNAPSHOT
server-utils:6.0.0.0-beta12-SNAPSHOT
...
CMW Root:6.0.0.0-beta12-SNAPSHOT
cmw-webapp:6.0.0.0-beta12-SNAPSHOT
cmw-core [dependencies on NRW Utils]:6.0.0.0-beta12-SNAPSHOT
...
NRW Root :6.0.0.0-beta12-SNAPSHOT
nrw-webapp [depends on NRW Utils & CMW Root modules]:6.0.0.0-beta12-SNAPSHOT
...
改变的原因:
每个集合模块(即 NRW Utils、CMW Root 和 NRW Root)的大小越来越大,构建过程开始花费大量时间(有时约 4 小时)。
新计划:
build [MVN plugins, third party dependency management]:5.1
NRW Utils:6.0.0.0-NU-beta4-SNAPSHOT
server-utils:6.0.0.0-NU-beta4-SNAPSHOT
...
CMW Root:6.0.0.0-CMW-beta12-SNAPSHOT
cmw-webapp:6.0.0.0-CMW-beta12-SNAPSHOT
cmw-core [dependencies on NRW Utils]:6.0.0.0-CMW-beta12-SNAPSHOT
...
NRW Root :6.0.0.0-NRW-beta9-SNAPSHOT
nrw-webapp [depends on NRW Utils & CMW Root modules]:6.0.0.0-NRW-beta9-SNAPSHOT
...
我们已经开始在版本中引入“键”来区分不同的“集合模块”,因此可以轻松执行分步发布。此外,我们的实用程序模块更加稳定,因此我们可能不需要那么多的 beta 版本 - 现在对保持 beta 编号同步没有任何限制。
还值得注意的是,实际上有 5 个不同的“集体模块”(不仅仅是 3 个)都使用不同的版本(通过唯一键区分)构建,这就是为什么我认为最好有一个版本的集中位置,而不是 5 个不同 POM 中的重复属性。
现在问题在于在不同版本的不同“集合模块”中定义对模块的依赖关系时 POM 文件的内容。
建议的依赖版本管理解决方案:
build [MVN plugins, third party dependency management]:5.1
nrw-version-management:6.0.0.0-beta-SNAPSHOT
[contains properties defining latest versions of each collective module]
NRW Utils:6.0.0.0-NU-beta4-SNAPSHOT
server-utils:6.0.0.0-NU-beta4-SNAPSHOT
...
CMW Root:6.0.0.0-CMW-beta12-SNAPSHOT
cmw-webapp:6.0.0.0-CMW-beta12-SNAPSHOT
cmw-core [dependencies on NRW Utils]:6.0.0.0-CMW-beta12-SNAPSHOT
...
NRW Root :6.0.0.0-NRW-beta9-SNAPSHOT
nrw-webapp [depends on NRW Utils & CMW Root modules]:6.0.0.0-NRW-beta9-SNAPSHOT
...
nrw-version-management (pom.xml):
...
<parent>
<groupId>com.project</groupId>
<artifactId>build</artifactId>
<version>5.1</version>
</parent>
<groupId>com.project</groupId>
<artifactId>nrw-versions-manager</artifactId>
<version>6.0.0.0-beta-SNAPSHOT</version>
<name>Version Maven Properties</name>
<description>A centralised place for all module property versions</description>
<packaging>pom</packaging>
<properties>
<nrw.utilities.version>6.0.0.0-NU-beta4-SNAPSHOT</nrw.utilities.version>
<nrw.cmw.version>6.0.0.0-CMW-beta12-SNAPSHOT</nrw.cmw.version>
<nrw.version>6.0.0.0-NRW-beta9-SNAPSHOT</nrw.version>
</properties>
...
CMW 根 (pom.xml):
...
<parent>
<groupId>com.project</groupId>
<artifactId>nrw-versions-manager</artifactId>
<version>${nrw.core.version}</version>
...
</parent>
<groupId>com.project</groupId>
<artifactId>CMW-root</artifactId>
<version>6.0.0.0-CMW-beta12-SNAPSHOT</version>
<packaging>pom</packaging>
<dependencyManagement>
<dependencies>
...
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>server-utils</artifactId>
<version>${nrw.utilities.version}</version>
</dependency>
...
</dependencyManagement>
<profiles>
<profile>
<id>all</id>
<modules>
<module>cmw-webapp</module>
<module>cmw-core</module>
...
</modules>
</profile>
...
</profiles>
...
注意然后,属性 ${nrw.core.version} 将通过命令行参数(或默认属性值)设置为 6.3.0.0-beta-SNAPSHOT 以进行快照构建。
可能的发布过程(针对 6.0.0.0):
- 如果尚未构建,请构建 5.1 构建模块
- 构建 nrw-version-management 6.0.0.0(以避免快照依赖 - 但尚未更改任何属性)
- 构建 NRW 实用程序 6.0.0.0-NU cmd 参数:-Dnrw.core.version=6.0.0.0
- 构建 CMW 根 6.0.0.0-CMW cmd参数:-Dnrw.core.version=6.0.0.0 -Dnrw.utilities.version=6.0.0.0-NU
- 构建 NRW 根 6.0.0.0-NRW cmd参数:-Dnrw.core.version=6.0.0.0 -Dnrw.utilities.version=6.0.0.0-NU -Dnrw.cmw.version=6.0.0.0-CMW
- 为存储库重新构建 nrw-version-management 6.0.0.0 cmd参数:-Dnrw.core.version=6.0.0.0 -Dnrw.utilities.version=6.0.0.0-NU -Dnrw.cmw.version=6.0.0.0-CMW
- 使用新的开发版本构建 nrw-version-management 6.1.0.0-beta-SNAPSHOT 并更新 POM 文件
问题:
构建过程似乎很冗长,尤其是与 nrw-version-management 模块有关。 另外,我开始看到这个警告:
'version' 包含一个表达式,但应该是一个常量
在进行了一些调查后,我现在了解到在设置版本时(指定父 POM 时)不建议使用表达式:
- Warning on using project.parent.version as the version of a module in Maven 3
- Maven: property substitution not done for /project/version tag of pom?
- http://maven.40175.n5.nabble.com/Pom-Parent-Version-Properties-td124576.html
问题:
- 我可以忽略这个警告吗?一些帖子开始建议使用属性指定父 POM 版本可能是可以接受的。
- 这种通用方法是传统方法吗?还是有缺陷?
- 是否有更好的解决方案来解决这个不断发展的项目的重组问题?
提前致谢。
【问题讨论】:
标签: maven maven-2 build-process maven-3