Spring Boot打包Jar使用java -cp指定主类启动失败及可行性咨询
问题解答:Spring Boot Jar无法通过
java -cp指定主类运行的原因及解决办法 兄弟,我来给你拆解一下这个问题,你遇到的情况其实是Spring Boot打包的Jar结构特性导致的,咱们一步步说:
一、为什么会报错Error: Could not find or load main class com.hw.Main?
Spring Boot默认打包出来的是可执行Jar,它的内部结构和普通Java Jar完全不一样:
- 你的业务类(包括
com.hw.Main)实际被放在Jar内部的BOOT-INF/classes/目录下 - 所有依赖的第三方Jar则放在
BOOT-INF/lib/目录下 - 而
java -cp命令只会扫描Jar根目录下的类文件,不会递归读取BOOT-INF/classes里的内容,所以它找不到你的主类,自然就报错了。
二、能不能用java -cp jarName.jar com.hw.Main运行Spring Boot打包的Jar?
直接这么写肯定不行,但有两种可行的方式可以实现类似需求:
方式1:借助Spring Boot自带的启动器类运行
Spring Boot的可执行Jar里自带了一个专门的启动器类,你可以用它来间接启动你的主类,同时还能传递参数。命令格式如下:
java -cp jarName.jar org.springframework.boot.loader.JarLauncher --param=someParam
- 注意参数要放在
JarLauncher后面,Spring Boot会自动把这些参数传递给你的com.hw.Main类 - 不同Spring Boot版本的启动器类路径可能略有差异,主流版本都是
org.springframework.boot.loader.JarLauncher,如果找不到可以查看Jar里的META-INF/MANIFEST.MF文件,里面的Start-Class就是你的主类,而Main-Class就是Spring Boot的启动器类。
方式2:打包成普通Jar而非可执行Jar
如果你就是想直接用java -cp指定主类运行,可以修改打包配置,让Spring Boot生成普通Jar:
- 如果你用Maven,在
pom.xml里修改Spring Boot插件配置:
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <!-- 跳过可执行Jar的打包逻辑,生成普通Jar --> <skip>true</skip> </configuration> </plugin> </plugins> </build>
- 打包后得到的普通Jar里,你的类会直接放在对应包路径下,这时候就能用
java -cp jarName.jar com.hw.Main --param=someParam正常运行了 - 但这种方式的缺点是:你需要手动把所有依赖的Jar都加到类路径里,不像可执行Jar那样自带所有依赖,适合依赖较少的场景。
内容的提问来源于stack exchange,提问作者Rakib
相关产品推荐
相关产品推荐

