You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用spring-boot-maven-plugin构建的Fat JAR运行时抛出ClassNotFoundException

解决Spring Boot可执行JAR运行时java.lang.ClassNotFoundException(主类找不到)问题

嘿,我之前碰到过好多次这种情况,咱们一步步来排查和解决:

1. 先确认spring-boot-maven-plugin配置是否到位

首先看你的pom.xml里的插件配置,这是最容易出问题的地方。正确的配置应该包含repackage目标(这是把普通JAR转成Spring Boot可执行JAR的核心步骤),并且正确指定主类的全路径:

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <version>你的Spring Boot版本号</version> <!-- 建议和parent的Spring Boot版本保持一致 -->
            <executions>
                <execution>
                    <goals>
                        <goal>repackage</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <!-- 这里一定要填你主类的完整包名+类名,大小写必须完全匹配! -->
                <mainClass>com.yourcompany.yourapp.YourMainApplication</mainClass>
            </configuration>
        </plugin>
    </plugins>
</build>

如果没加repackage目标,插件只会生成普通JAR,而不是Spring Boot可执行JAR,这时候运行肯定找不到主类。

2. 检查主类的注解和main方法是否正确

你的主类必须满足两个条件:

  • 带有@SpringBootApplication注解(这个注解包含了自动配置、组件扫描等关键功能)
  • 拥有标准的main方法:public static void main(String[] args),并且方法内正确调用SpringApplication.run()

举个正确的例子:

package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class DemoApplication {
    public static void main(String[] args) {
        // 这里要传入当前主类的Class对象,别写错类名!
        SpringApplication.run(DemoApplication.class, args);
    }
}

另外,主类的包位置最好是所有业务类的根包,这样Spring才能自动扫描到子包中的组件(当然如果配置了@ComponentScan另说)。

3. 用正确的命令打包

别直接用mvn package,建议用以下命令之一:

  • mvn clean package spring-boot:repackage:明确执行Spring Boot的重新打包目标
  • mvn clean install:如果你的插件配置里已经加了executions块,install阶段会自动触发repackage

打包完成后,去target目录看:会生成两个JAR文件,一个是带.original后缀的普通JAR,另一个是不带后缀的可执行JAR——你要运行的是不带.original的那个!

4. 验证主类是否被打包进JAR

如果还是报错,咱们可以手动检查JAR内容:
打开终端,执行命令:

jar tf your-app-1.0.0.jar

在输出里找你的主类对应的.class文件,比如com/example/demo/DemoApplication.class。如果找不到,说明打包时主类没被包含进去,这时候要检查pom.xml里的sourceDirectory配置,有没有把主类所在的src/main/java目录排除了,或者IDE的编译缓存有问题——可以先执行mvn clean,再删除IDE的target目录,重新编译打包。

5. 多模块项目的特殊情况

如果你的项目是多模块结构,要注意:

  • 主类必须放在专门的启动模块里
  • spring-boot-maven-plugin只能配置在启动模块的pom.xml里,不能放在父pom里(除非你明确配置了模块继承)

要是上面的步骤都试过还是解决不了,把你的pom.xml代码、完整的错误日志和主类代码贴出来,我再帮你深挖问题~

内容的提问来源于stack exchange,提问作者Macieyo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 04:00:05