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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:36:04