如何在Maven中更新子模块的版本?

何塞·马丁内斯:

如何更新子模块的版本?有很多类似这样的Stackoverflow问题,但是我找不到适合这种情况的问题……如果重复的话,我会很乐意。

考虑以下项目。

parent
  --mod1
  --mod2

在开发版本发布周期的开始,我需要将父代和模块更新为相同的版本。如果父版本和模块的版本在整个发行版中保持不变,那么我将忽略<version>模块中标签并执行versions:set -DnewVersion=1.1.1以启动开发周期。但是事实证明,这些模块并没有全部以相同的版本结束循环。随着错误和修补程序的实现,只有那些带有错误的模块才得以实现,并且此类更新。例如,父级和mod2的版本可能是1.1.1-RC1,而mod1的版本可能是1.1.1-RC2。

因此,我需要:
1)<version>在模块中包含一个标记,以独立跟踪每个模块的版本。

2)如果mod2需要mod1作为依赖项,则需要确保mod2引用了最新版本的mod1。

这导致以下两个问题。

1)在周期开始时,如何在一个maven命令中将父级和模块设置为相同版本?我试过了version:set -DnewVersion=1.1.1,但这只会更新所有POM上的父版本,而不更新模块的版本。我也尝试过-N versions:update-child-modules,但是我认为我使用错了,因为它什么都不做,只是显示了所有模块的跳过。

2)这有点难,并且与上面的项目2匹配。如何一步一步更新mod1的版本和mod2对mod1的版本的引用?我知道如何分两个步骤进行操作:

父pom:

<properties>
    <!-- update this manually if mod1's version no longer matches parent -->
    <mod1.version>${project.version}</mod1.version>
</properties>

mod2 pom:

    <dependency>
        <groupId>com.xxx</groupId>
        <artifactId>mod1</artifactId>
        <version>${mod1.version}</version>
    </dependency>

当mod1达到1.1.1-RC2时,我更新了父POM和mod1 POM以反映这一点。这是两个步骤。反正把它变成一步?

我的示例很小,但是在现实生活中,有许多模块可以节省重要的时间,而且我很好奇。

胡安:

问题1)

管理应用程序生命周期和发布的最佳方法是使用发布插件。

如您所知,Maven哲学是约定而非配置。Maven约定是在开发期间使用快照版本(以-SNAPSHOT结尾的版本),并仅为发行版分配非快照版本。

假设您正在开发1.1.1版。在开发过程中,您只需使用1.1.1-SNAPSHOT。Maven将负责快照的更新。如果使用工件存储库,则可以使用-U来确保始终具有最新版本的快照。

发布准备就绪后,发布插件将生成并部署1.1.1版本,并使用新的开发版本(例如1.1.2-SNAPSHOT)更新POM。

关于多模块项目,有两种方案:模块是相关但独立的(例如多个Web应用程序),或者它们是单个大型应用程序或库的模块,并且它们共享版本。您似乎对后者感兴趣。

在这种情况下,最好的方法是继承同一个父模块(可能也是根模块),包括其版本。您引用父组:artifact:版本,但未指定子版本。通常,您也继承组,因此您的子pom可能如下所示:

<parent>
   <groupId>com.mycompany.myproject</groupId>
   <artifactId>myproject-parent</artifactId>
   <version>1.1.1-SNAPSHOT</version>
   <relativePath>../myproject-parent</relativePath>
</parent>
<artifactId>myproject-module1</artifactId>

现在,您只需要在发行插件的帮助下照顾指向正确版本的父母的孩子。

为了帮助它了解孩子,您应该通过包含模块部分(如后面所示),使父pom成为root pom。

问题2)我通常在父级中声明带有可能被引用的所有工件的所有版本的属性。如果多个模块共享版本,则只需一个属性。父母看起来像:

<groupId>com.mycompany.myproject</groupId>
<artifactId>myproject-parent</artifactId>
<version>1.1.1-SNAPSHOT</version>
<packaging>pom</packaging>
<properties>
   <myproject.version>1.1.1-SNAPSHOT</myproject.version>
</properties>

.......

<modules>
   <module>../myproject-module1</module>
   ...
</modules>

孩子们可以使用引用其他模块

<version>${myproject.version}</version>

使用LATEST声明依赖关系是非常糟糕的做法。假设您为版本1.1.1执行此操作。现在,您正在使用1.1.2-SNAPSHOT版本,并且可能在本地存储库中安装了此版本的工件。

现在说一下,由于某种原因,例如由于生产中的错误,您需要重建1.1.1版。您的版本将使用新版本。如果幸运的话,这将破坏构建。如果您不走运,它甚至可能会在生产中不被注意。

最后但并非最不重要的一点是,有些人喜欢使用属性值声明子版本。强烈建议您不要这样做,并且行家会将其报告为警告。我个人从来没有这样做。原因还与构建的可复制性以及Maven认为发行版本永远不会改变的事实有关。使模块版本在外部可调整并不是一个好主意。

编辑:

模块版本未对齐的情况。

实际上,两种情况都可以混合使用。例如,您可以拥有:

父母

---组件1

---组件2

---组件3

------ Comp3Module1

------ Como3Module2

------ Comp3Module3

父级和三个组件版本不同,而component3的三个模块共享相同的版本,如前所述。

问题1)在这种情况下,每个模块的版本均未指定。如前所述,使用属性指定模块版本是不恰当的,这就是为什么我只能建议直接指定版本的原因。如前所述,管理版本控制的最佳方法是使用发布插件,并将其与SVN等版本控制系统集成。其他答案提供了有关如何使用它的详细信息,因此,除非有要求,否则我将不作进一步阐述。

问题2)对于共享相同版本的情况,推荐的方法与上述方法相同,只是您需要多个属性。父母看起来像:

<properties>
   <myproject.group>com.mycompany.myproject</myproject.group>
   <component1.version>1.1.1-RC1</component1.version>
   <component2.version>1.1.1-RC2</component2.version>
   <component3.version>2.0.0</component3.version>
<properties>

然后,您可以使用依赖项管理将版本管理集中在父级中。

例如,在父pom中,

<dependencyManagement>
   <dependencies>
      <dependency>
         <groupId>${myproject.group}</groupId>
         <artifactId>component1</artifactId>
         <version>${component1.version}</version>
      </dependency>
      <dependency>
        <groupId>${myproject.group}</groupId>
         <artifactId>component2</artifactId>
         <version>${component2.version}</version>
         <type>war</type>
      </dependency>
      <dependency>
         <groupId>${myproject.group}</groupId>
         <artifactId>comp3module1</artifactId>
         <version>${component3.version}</version>
        <type>ejb</type>
      </dependency>
      <dependency>
         <groupId>${myproject.group}</groupId>
         <artifactId>comp3module1</artifactId>
         <version>${component3.version}</version>
        <type>ejb-client</type>
      </dependency>
      <dependency>
         <groupId>${myproject.group}</groupId>
         <artifactId>comp3module2</artifactId>
         <version>${component3.version}</version>
        <type>war</version>
      </dependency>
   </dependencies>
</dependencyManagement>

现在,要引用任何其他模块中的任何模块,就像这样简单:

<dependency>
   <groupId>${myproject.group}</groupId>
   <artifactId>component1</artifactId>
</dependency>
<dependency>
   <groupId>${myproject.group}</groupId>
   <artifactId>comp3module1</artifactId>
   <type>ejb-client</type>
</dependency>

版本是从父级自动管理的。您无需将它们维护在子项依赖项中,这也不再那么冗长。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章