如何运行主类位于依赖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
相关产品推荐
相关产品推荐

