gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 22:41:25 47 4
gpt4 key购买 nike

如何更新子模块的版本?有很多类似这样的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以反射(reflect)这一点。这是两个步骤。反正把它变成一步?

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

最佳答案

问题1)

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

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

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

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

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

在这种情况下,最好的方法是继承同一个父模块(可能也是根模块),包括其版本。您引用父组:artifact:版本,但未指定子版本。通常,您还继承了group,因此您的子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>

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

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

问题2)
我通常在父级中声明所有可能引用的所有工件的属性。如果多个模块共享版本,则只需一个属性。 parent 看起来像:
<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>

children 可以使用引用其他模块
<version>${myproject.version}</version>

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

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

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

编辑:

模块版本未对齐的情况。

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

parent

---组件1

---组件2

---组件3

------ Comp3Module1

------ Como3Module2

------ Comp3Module3

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

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

问题2)
推荐的方法与共享相同版本的情况相同,只是您需要多个属性。
parent 看起来像:
<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>

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

关于java - 如何在Maven中更新子模块的版本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32209755/

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