SpringBoot多级多模块聚合项目下maven打包报‘packaging‘ with value ‘jar‘ is invalid.

问题场景:

SpringBoot多级多模块项目中部分pom文件报红,mvn clean时报错:'packaging' with value 'jar' is invalid. Aggregator projects require 'pom' as packaging.


项目背景

项目是一个多级多模块项目,简单分为:1-2-3三级项目,2是1的子项目,3是2的子项目,这些在pom配置文件中都有说明:

  1. 1、2的pom文件中有通过modules标签去指向包含的子项目
  2. 2、3的pom没有使用parent标签去指向其父项目,都是直接指向spring-boot-starter-parent

原因分析:

通过报错提示可以得知:值为"jar"的"packaging"无效。聚合器项目需要"pom"作为包装。此时我做了几个动作去排查:

  1. 因为是第二级项目中的pom文件异常,所以我此时查看的是第一级项目中的pom文件配置,不过通过pom.xml文件可以得知第一级项目中已经配置了打包的配置文件是pom。
  2. 怀疑是parent标签指向的spring-boot-starter-parent的默认打包方式不对,但是查看之后发现也是对的。
  3. 重新编译,使用clean标签,报错。
  4. 查了一下百度,确实是只需要在pom文件中指定打包方式是pom就可以了,后来发觉估计是因为是多级项目导致,因为之前一级项目下的其他二级子模块并没有自己的第三级子模块,所以没有这个问题。

根本原因

在 Maven 项目中,如果没有在 pom.xml 文件中显式指定打包方式(packaging),Maven 会根据项目的类型自动选择一个默认值。对于普通的 Maven 项目(非聚合项目),默认的打包方式是 jar,因为大多数 Java 项目最终都会生成一个 JAR 文件作为输出工件。

这个默认值是在 Maven 的核心逻辑中硬编码的,不是在一个特定的配置文件或属性中指定的。Maven 在解析 pom.xml 文件并构建项目时,会检查是否设置了 标签。如果没有设置,Maven 就会使用默认的打包方式 jar。

对于聚合项目(aggregator project),情况则有所不同。聚合项目本身不产生输出工件,而是用来管理和构建一组子模块。因此,对于聚合项目,必须在 pom.xml 文件中显式设置 pom,以指定其为聚合项目。如果不这样做,而尝试使用默认的 jar 打包方式,就会导致上述异常。

总之,Maven 项目默认的打包方式 jar 是由 Maven 的内部逻辑决定的,而不是在某个配置文件或属性中指定的。而对于聚合项目,则必须在 pom.xml 中显式设置打包方式为 pom。


解决方案:

在存在三级子模块的二级子模块下指定打包格式是pom即可。

xml 复制代码
<packaging>pom</packaging>
相关推荐
2401_873479402 小时前
运营活动被薅羊毛怎么防?用IP查询+设备指纹联动封堵漏洞
java·网络·tcp/ip·github
ShiJiuD6668889992 小时前
大事件板块一
java
摇滚侠2 小时前
@Autowired 和 @Resource 的区别
java·开发语言
SeaTunnel2 小时前
(八)收官篇 | 数据平台最后一公里:数据集成开发设计与上线治理实战
java·大数据·开发语言·白鲸开源
Ting-yu2 小时前
SpringCloud快速入门(7)---- 数据隔离
spring boot·spring·spring cloud
吴声子夜歌3 小时前
Java——线程的基本协作机制
java·线程协作
谙弆悕博士3 小时前
【附C++源码】从零开始实现 2048 游戏
java·c++·游戏·源码·项目实战·2048
独自归家的兔4 小时前
OCPP 1.6 协议详解:GetLocalListVersion 获取本地列表版本指令
java·后端·物联网·spring·ocpp1.6
Apache RocketMQ5 小时前
RocketMQ源码解析——秒级定时消息介绍
java·云原生·消息队列·rocketmq·java-rocketmq
xiaoming00185 小时前
JAVA项目打包部署运维全流程(多服务、批量)
java·linux·运维