Maven打包Spring Boot应用报错:无法找到或加载主类
问题原因与解决方案
核心问题
你用的maven-jar-plugin只能打包项目自身的编译后class文件,不会把Spring Boot等第三方依赖包一并打包进生成的Jar里。运行java -jar时,JVM找不到依赖的org.springframework.boot.CommandLineRunner类,所以抛出NoClassDefFoundError。
另外你手动打包的命令也有问题:jar cfm Melodify.jar Manifest.mf -C Melodify/src/main/java/ . 打包的是Java源文件(.java),不是编译后的字节码文件(.class),就算包含依赖也无法正常运行。
正确解决方案
用Spring Boot官方提供的spring-boot-maven-plugin,它会自动把所有依赖打包成一个可执行的"胖Jar",包含项目代码和所有第三方依赖类。
- 修改
pom.xml,替换原有的maven-jar-plugin配置为:
<plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>3.2.0</version> <!-- 版本要和你的Spring Boot版本保持一致 --> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> <configuration> <mainClass>bg.sofia.uni.fmi.melodify.MelodifyApplication</mainClass> </configuration> </plugin>
重新打包:
- 在IntelliJ的Maven视图中,执行
clean和package目标(直接点击"package"即可) - 或者在项目根目录执行命令:
mvn clean package
- 在IntelliJ的Maven视图中,执行
运行生成的Jar:
打包完成后,target目录下会生成两个Jar文件:带.original后缀的是普通Jar,不带后缀的是可执行胖Jar。运行不带后缀的那个:java -jar target/melodify-xxx.jar
补充说明
- Spring Boot的
repackage目标会把普通Jar重新打包为可执行Jar,自动处理依赖打包和清单配置,不用手动编写Manifest.mf。 - 如果你的
pom.xml还没加Spring Boot父依赖,需要补上:
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>3.2.0</version> <!-- 与插件版本一致 --> <relativePath/> </parent>
内容的提问来源于stack exchange,提问作者Kotaka Danski
相关产品推荐
相关产品推荐

