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

如何运行主类位于依赖JAR中的Spring可执行JAR

如何让Spring Boot从BOOT-INF/lib中的JAR读取主类

我正在开发一个Spring Boot项目,生成的可执行JAR结构如下:

BOOT-INF/
----classes/ <nothing inside classes>
----lib/
---------myDependency.jar ----> (包含主类)
---------anotherDependency.jar
META-INF/
org
----springframework ...

我的@SpringBootApplication主类存在于myDependency.jar中。问题在于,Spring Boot的JarLauncher类默认逻辑会优先从BOOT-INF/classes目录查找主类,导致无法从myDependency.jar中定位到主类。以下是可行的解决办法:

解决方法

1. 构建时显式指定主类全限定名

Spring Boot的JarLauncher实际通过META-INF/MANIFEST.MF中的Start-Class属性定位主类,只要这个属性指向正确的类名,不管类在BOOT-INF/classes还是BOOT-INF/lib的JAR里,都能被找到。

Maven配置

在项目pom.xml中给Spring Boot Maven插件添加主类配置:

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <!-- 替换成你的主类完整包路径+类名 -->
                <mainClass>com.yourpackage.YourSpringBootApplication</mainClass>
            </configuration>
        </plugin>
    </plugins>
</build>

Gradle配置

Groovy DSL版本:

springBoot {
    // 替换成你的主类完整包路径+类名
    mainClass = 'com.yourpackage.YourSpringBootApplication'
}

Kotlin DSL版本:

springBoot {
    mainClass.set("com.yourpackage.YourSpringBootApplication")
}

2. 验证配置是否生效

构建完成后,查看JAR内的META-INF/MANIFEST.MF文件,确认存在以下两行配置:

Main-Class: org.springframework.boot.loader.JarLauncher
Start-Class: com.yourpackage.YourSpringBootApplication

只要Start-Class的值正确,启动JAR时JarLauncher会自动遍历BOOT-INF/lib下的所有依赖JAR,找到对应的主类并启动应用。

3. 自定义启动器(进阶场景)

如果有特殊需求需要定制主类查找逻辑,可以继承JarLauncher并重写相关方法,但绝大多数场景下,第一种方法已经足够解决问题,无需额外定制。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 07:22:43