在noah部署平台发布时遇到以下错误:
Error: Could not find or load main class org.springframework.boot.loader.lau
🔑 核心原理对比
表格
| 方式 | 作用范围 | 插件配置继承情况 | repackage是否自动触发 |
|---|---|---|---|
继承 spring-boot-starter-parent | 完整 POM 继承 | ✅ 继承父 POM 中 <build><plugins> 的完整配置 | ✅ 自动绑定到 package 阶段 |
仅导入 spring-boot-dependencies BOM | 仅 <dependencyManagement> | ❌ 不继承任何构建配置(插件、生命周期绑定等) | ❌ 需手动配置 <executions> |
<!-- spring-boot-starter-parent POM 片段 -->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<id>repackage</id>
<goals><goal>repackage</goal></goals> <!-- 已绑定到 package 阶段 -->
</execution>
</executions>
</plugin>
</plugins>
</build>
- Maven 继承机制 会将父 POM 的
<build>配置(含插件绑定)完整传递给子项目 - 执行
mvn package时:maven-jar-plugin生成普通 JAR(如app.jar)- 自动触发
spring-boot-maven-plugin:repackage目标 - 重打包为含
BOOT-INF/和org/springframework/boot/loader/的可执行 Fat JAR - 原始 JAR 重命名为
app.jar.original
❌ 仅使用 BOM(spring-boot-dependencies)时(需手动配置)
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>3.x.x</version>
<type>pom</type>
<scope>import</scope> <!-- 仅导入依赖版本管理 -->
</dependency>
</dependencies>
</dependencyManagement>
- BOM 仅提供
<dependencyManagement>(统一依赖版本),不包含<build>配置 - Maven 不会继承 任何插件绑定逻辑
- 执行
mvn package时:- 仅由
maven-jar-plugin生成普通 JAR(无BOOT-INF/,无JarLauncher) - ❌ 无法通过
java -jar启动 → 触发你遇到的ClassNotFoundException: JarLauncher
- 仅由
BOM 场景下正确配置(必须手动添加)
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal> <!-- 显式绑定 repackage 目标 -->
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
💡 提示:若未配置 <executions>,即使声明了插件,mvn package 也不会触发 repackage(知识库 [2] 强调:插件目标需显式绑定到生命周期阶段)
🌰 类比理解
表格
| 方式 | 类比 | 结果 |
|---|---|---|
继承 parent | “继承整套装修方案(含水电改造)” | 开箱即用,自动完成 Fat JAR 打包 |
| 仅用 BOM | “只拿了一份建材价格清单” | 需自己设计施工流程(手动配置插件绑定) |
💡 总结
spring-boot-starter-parent= 完整构建模板(含插件绑定逻辑)→ 自动触发 repackagespring-boot-dependenciesBOM = 纯依赖版本管理器 → 无构建逻辑,必须手动配置插件绑定- 你遇到的
JarLauncher找不到,本质是 未触发 repackage,生成的只是普通 JAR(验证方法:jar -tf app.jar | grep loader应无输出)
选择方案时:
- 追求简洁 → 继承
spring-boot-starter-parent - 需要自定义父 POM(如公司统一父 POM)→ 用 BOM + 手动配置插件绑定(缺一不可)

2492

被折叠的 条评论
为什么被折叠?



