gpt4 book ai didi

关于大型项目的版本控制和避免包含表达式的版本的 Maven 建议

转载 作者:行者123 更新时间:2023-12-04 20:19:00 30 4
gpt4 key购买 nike

我正在考虑重组一个大型 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-版本管理(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' contains an expression but should be a constant



    在做了一些调查之后,我现在明白在设置版本时不建议使用表达式(指定父 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 建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8940507/

    30 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com