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>
相关推荐
南宫生1 小时前
力扣每日一题【算法学习day.132】
java·学习·算法·leetcode
计算机毕设定制辅导-无忧学长1 小时前
Maven 基础环境搭建与配置(一)
java·maven
bing_1582 小时前
简单工厂模式 (Simple Factory Pattern) 在Spring Boot 中的应用
spring boot·后端·简单工厂模式
天上掉下来个程小白2 小时前
案例-14.文件上传-简介
数据库·spring boot·后端·mybatis·状态模式
风与沙的较量丶2 小时前
Java中的局部变量和成员变量在内存中的位置
java·开发语言
m0_748251722 小时前
SpringBoot3 升级介绍
java
极客先躯3 小时前
说说高级java每日一道面试题-2025年2月13日-数据库篇-请说说 MySQL 数据库的锁 ?
java·数据库·mysql·数据库的锁·模式分·粒度分·属性分
程序员侠客行3 小时前
Spring事务原理 二
java·后端·spring
小猫猫猫◍˃ᵕ˂◍4 小时前
备忘录模式:快速恢复原始数据
android·java·备忘录模式
liuyuzhongcc4 小时前
List 接口中的 sort 和 forEach 方法
java·数据结构·python·list