Maven多模块实现统一版本管理

本文介绍如何在Maven项目中高效管理版本号,特别是在多模块项目中。通过使用${project.build.version}

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在使用Maven多模块结构工程时,配置版本号是一个比较头疼的事。继承版本、依赖版本、自身版本都需要单独定义,很是麻烦。比如在微服务系统中,所有服务都依赖一个包,里面进行版本管理。每个服务的version版本管理却是单独使用一个版本号。然后我们在版本快速迭代中,通常是要不断地切换version,当服务众多的时候,修改起版本来就很麻烦。

Maven官方文档说:自 Maven 3.5.0-beta-1 开始,可以使用 ${revision}, ${sha1} and/or ${changelist} 这样的变量作为版本占位符。

命令

mvn clean install versions:set -DnewVersion=2.0.2

 单模块项目

<project>
	<modelVersion>4.0.0</modelVersion>
	<groupId>com.xh</groupId>
	<artifactId>personal-platform</artifactId>
	<version>${project.build.version}</version>
	...
	<properties>
	    <project.build.version>2.0.3</project.build.version>
	</properties>

</project>

这种情况比较简单,只使用了 ${project.build.version} 来替换版本。

多模块项目


现在来看看多模块构建的情况,有一个父项目和一个或多子模块。

父pom

<project>
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.xh</groupId>
    <artifactId>personal-platform</artifactId>
    <packaging>pom</packaging>
    <version>${project.build.version}</version>

    ...
    <properties>
        <project.build.version>2.0.3</project.build.version>
    </properties>

    <modules>
        <module>commons-center</module>
    </modules>
</project>

子pom

<project>
    <parent>
        <artifactId>personal-platform</artifactId>
        <groupId>com.anchnet</groupId>
        <version>${project.build.version}</version>
    </parent>

    <modelVersion>4.0.0</modelVersion>
    <artifactId>commons-center</artifactId>
    <packaging>pom</packaging>

</project>

多模块项目中子模块的版本应该使用父工程的版本,单独设置版本的话会导致版本混乱。

打包

package、install、deploy

如果使用以上设置来发布,必须使用 flatten-maven-plugin

<build>
    <plugins>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>flatten-maven-plugin</artifactId>
            <version>1.3.0</version>
            <configuration>
                <!--true:更新pom文件,不然无法更新module里的pom版本号,此处还有更高级的用法,具体参靠官方文档-->
                <updatePomFile>true</updatePomFile>
                <flattenMode>resolveCiFriendliesOnly</flattenMode>
            </configuration>
            <executions>
                <execution>
                    <id>flatten</id>
                    <phase>process-resources</phase>
                    <goals>
                        <goal>flatten</goal>
                    </goals>
                </execution>
                <execution>
                    <id>flatten.clean</id>
                    <phase>clean</phase>
                    <goals>
                        <goal>clean</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

最终执行 package、install、deploy 后,maven会将该module的pom文件中的 ${project.build.version} 替换为实际的版本号,轻松解决pom中版本号的问题。

官网

Maven – Maven CI Friendly Versions

Maven 多模块项目中,模块间的版本依赖管理主要通过父 POM(Project Object Model)来实现。父 POM 作为整个项目的统一配置中心,负责定义所有子模块共享的配置信息,包括依赖管理、插件配置以及版本控制策略。通过这种方式,可以确保项目中所有模块保持一致的依赖版本,避免版本冲突和重复配置。 ### 依赖管理 Maven 提供了 `<dependencyManagement>` 元素用于集中管理依赖版本。在父 POM 中定义 `<dependencyManagement>` 后,所有子模块可以直接引用这些依赖,而无需指定版本号。这样可以确保所有子模块使用相同的依赖版本,同时也简化了版本升级的流程。 ```xml <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> <version>2.7.0</version> </dependency> </dependencies> </dependencyManagement> ``` 在子模块中引用时,只需指定 `groupId` 和 `artifactId`,无需指定 `version`: ```xml <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> </dependencies> ``` 这种机制使得依赖版本的控制更加集中和灵活,同时也降低了版本不一致带来的风险[^2]。 ### 版本控制 Maven 多模块项目中的版本管理通常通过父 POM 的 `<modules>` 和 `<version>` 元素进行统一控制。父 POM 定义了整个项目的版本号,并且可以通过 `<modules>` 元素列出所有子模块。当父 POM 的版本发生变更时,所有子模块版本也可以随之统一变更,从而确保整个项目的一致性。 ```xml <modules> <module>module-a</module> <module>module-b</module> </modules> <version>1.0.0</version> ``` Maven 还支持使用版本范围(如 `[1.0.0, 2.0.0)`)来指定依赖版本,但这可能会导致不可预测的构建结果。因此,建议在生产环境中使用固定版本号以确保构建的稳定性[^1]。 ### 构建顺序与依赖传递 Maven 会根据模块间的依赖关系自动确定构建顺序。如果模块 A 依赖模块 B,则 Maven 会首先构建模块 B,然后再构建模块 A。这种依赖关系可以通过在模块 A 的 POM 文件中声明对模块 B 的依赖来实现: ```xml <dependencies> <dependency> <groupId>com.example</groupId> <artifactId>module-b</artifactId> <version>${project.version}</version> </dependency> </dependencies> ``` 通过这种方式,Maven 可以自动解析模块间的依赖关系,并确保正确的构建顺序[^2]。 ### 使用属性管理版本 Maven 允许通过 `<properties>` 元素定义版本号,从而实现更灵活的版本管理。例如,可以将所有 Spring Boot 相关的依赖版本定义为一个属性: ```xml <properties> <spring.boot.version>2.7.0</spring.boot.version> </properties> ``` 然后在 `<dependencyManagement>` 中引用该属性: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> <version>${spring.boot.version}</version> </dependency> ``` 这种方式使得版本号的修改更加方便,只需更改属性值即可更新所有相关依赖的版本[^1]。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

旷野历程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值