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

Ed *_*d . 5 build-process maven-2 maven-3 maven

我正在考虑重组一个大型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
      ...
Run Code Online (Sandbox Code Playgroud)

改变的原因:

每个集合模块(即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
      ...  
Run Code Online (Sandbox Code Playgroud)

我们已经开始在版本中引入"键"以区分不同的"集体模块",因此可以轻松执行步进版本.此外,我们的实用程序模块更稳定,因此我们可能不需要几乎同样多的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
         ... 
Run Code Online (Sandbox Code Playgroud)

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>
...
Run Code Online (Sandbox Code Playgroud)

CMW Root(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>
...
Run Code Online (Sandbox Code Playgroud)

注意,属性$ {nrw.core.version}将通过命令行参数(或默认属性值)设置为6.3.0.0-beta-SNAPSHOT以进行快照构建.

可能的发布过程(适用于6.0.0.0):

  1. 如果尚未构建,则构建5.1构建模块
  2. 构建nrw-version-management 6.0.0.0(以避免快照依赖性 - 但是尚未更改任何属性)
  3. 构建NRW Utils 6.0.0.0-NU cmd args:-Dnrw.core.version = 6.0.0.0
  4. 构建CMW Root 6.0.0.0-CMW cmd args:-Dnrw.core.version = 6.0.0.0 -Dnrw.utilities.version = 6.0.0.0-NU
  5. 构建NRW Root 6.0.0.0-NRW cmd args:-Dnrw.core.version = 6.0.0.0 -Dnrw.utilities.version = 6.0.0.0-NU -Dnrw.cmw.version = 6.0.0.0-CMW
  6. 为存储库cmd args重新构建nrw-version-management 6.0.0.0:-Dnrw.core.version = 6.0.0.0 -Dnrw.utilities.version = 6.0.0.0-NU -Dnrw.cmw.version = 6.0.0.0-CMW
  7. 使用新的dev版本构建nrw-version-management 6.1.0.0-beta-SNAPSHOT并更新POM文件

问题:

构建过程看起来很冗长,特别是与nrw-version-management模块有关.另外,我开始看到这个警告:

'version'包含一个表达式,但应该是一个常量

并且做了一些调查我现在理解在设置版本时(当指定父POM时)不建议使用表达式:

问题:

  • 我可以忽略这个警告吗?一些帖子开始建议使用属性指定父POM版本可能是可以接受的.
  • 这种一般方法是常规的吗?还是有缺陷的?
  • 是否有更好的解决方案来解决这个不断增长的项目的重组问题?

提前致谢.

Ed *_*d . 0

我认为在这个阶段在整个项目中坚持使用单一版本是不可行的,因为构建过程现在需要很长时间(前几天它在 7 小时后失败了!!)。

然而,下面的两个链接并没有完全回答我的问题,但已经达到了目的: