多模块Spring Boot项目如何为所有模块输出jar添加时间戳后缀
多模块Spring Boot项目Jar包统一添加时间戳后缀配置方案
核心问题原因
直接在单个模块配置maven.build.timestamp和finalName失效,本质是两个问题:
- 父POM未做统一配置,子模块没有继承统一的命名规则,模块间依赖解析时会出现文件名不匹配的构建错误
- Spring Boot打包插件默认会覆盖普通Maven Jar插件的命名规则,未做插件配置同步时,可执行Jar模块的命名不会生效
正确配置方案
第一步:修改父聚合POM全局配置
所有公共配置全部放在父POM中,子模块直接继承,无需重复配置。
- 在
properties节点定义时间戳格式和版本前缀,匹配你需要的E-Version-1.0.001-06-15-2022-09-32.jar命名格式 - 在
build节点定义全局finalName规则 - 通过
pluginManagement统一配置Maven Jar插件和Spring Boot打包插件的命名规则,避免插件覆盖文件名
父POM核心配置片段:
<properties> <java.version>1.8</java.version> <!-- 时间戳格式对应示例中的月-日-年-时-分 --> <maven.build.timestamp.format>MM-dd-yyyy-HH-mm</maven.build.timestamp.format> <!-- 自定义Jar包前缀,可根据实际版本调整 --> <jar.name.prefix>E-Version-1.0.001</jar.name.prefix> </properties> <build> <!-- 全局统一Jar包命名规则,所有子模块自动继承 --> <finalName>${jar.name.prefix}-${maven.build.timestamp}</finalName> <pluginManagement> <plugins> <!-- 普通Jar模块打包规则 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>3.2.0</version> <configuration> <finalName>${project.build.finalName}</finalName> </configuration> </plugin> <!-- Spring Boot可执行Jar模块打包规则,避免命名被覆盖 --> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <finalName>${project.build.finalName}</finalName> </configuration> </plugin> </plugins> </pluginManagement> </build>
父POM的packaging类型为
pom,本身不会产出Jar包,上述配置会自动向下传递给所有子模块。
第二步:调整子模块配置
- model、repository、service-api、service-impl四个普通Jar模块:不需要添加任何build相关配置,直接继承父POM规则即可。
- application可执行Jar模块:仅保留Spring Boot插件声明即可,不需要额外配置finalName,插件会自动读取全局命名规则,配置如下:
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>
第三步:执行构建
在项目根目录执行构建命令:mvn clean package
构建完成后,所有子模块target目录下的Jar包都会统一为指定的带时间戳后缀格式,且所有模块使用同一构建时间戳,不会出现命名不一致问题。
避坑说明
- 不要在子模块中单独重写
finalName或maven.build.timestamp.format配置,否则会覆盖全局规则导致模块间依赖解析失败。 - 如需调整命名格式、版本前缀,仅修改父POM
properties节点中的对应值即可,所有模块同步生效。 - 不需要引入额外的时间戳生成插件,使用Maven内置的
maven.build.timestamp属性即可满足需求,减少配置复杂度。
内容的提问来源于stack exchange,提问作者Cobra Commander
相关产品推荐
相关产品推荐

