解决Error: Could not find or load main class org.springframework.boot.loader.launch.JarLauncher问题

在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 时:
    1. maven-jar-plugin 生成普通 JAR(如 app.jar
    2. 自动触发 spring-boot-maven-plugin:repackage 目标
    3. 重打包为含 BOOT-INF/ 和 org/springframework/boot/loader/ 的可执行 Fat JAR
    4. 原始 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 = 完整构建模板(含插件绑定逻辑)→ 自动触发 repackage
  • spring-boot-dependencies BOM = 纯依赖版本管理器 → 无构建逻辑,必须手动配置插件绑定
  • 你遇到的 JarLauncher 找不到,本质是 未触发 repackage,生成的只是普通 JAR(验证方法:jar -tf app.jar | grep loader 应无输出)

选择方案时:

  • 追求简洁 → 继承 spring-boot-starter-parent
  • 需要自定义父 POM(如公司统一父 POM)→ 用 BOM + 手动配置插件绑定(缺一不可)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值