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>
相关推荐
空の鱼3 小时前
java开发,IDEA转战VSCODE配置(mac)
java·vscode
!!!5254 小时前
日志技术-LogBack入门程序&Log配置文件&日志级别
spring boot
P7进阶路4 小时前
Tomcat异常日志中文乱码怎么解决
java·tomcat·firefox
小丁爱养花5 小时前
Spring MVC:HTTP 请求的参数传递2.0
java·后端·spring
CodeClimb5 小时前
【华为OD-E卷 - 第k个排列 100分(python、java、c++、js、c)】
java·javascript·c++·python·华为od
等一场春雨5 小时前
Java设计模式 九 桥接模式 (Bridge Pattern)
java·设计模式·桥接模式
带刺的坐椅5 小时前
[Java] Solon 框架的三大核心组件之一插件扩展体系
java·ioc·solon·plugin·aop·handler
不惑_6 小时前
深度学习 · 手撕 DeepLearning4J ,用Java实现手写数字识别 (附UI效果展示)
java·深度学习·ui
费曼乐园6 小时前
Kafka中bin目录下面kafka-run-class.sh脚本中的JAVA_HOME
java·kafka
feilieren7 小时前
SpringBoot 搭建 SSE
java·spring boot·spring