使用spring-boot-maven-plugin构建的Fat JAR运行时抛出ClassNotFoundException
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

