多版本JAR中如何存放两个Java版本对应的@SpringBootApplication启动类?
错误原因
Spring Boot Maven插件的repackage目标默认会自动扫描项目所有编译产物,查找带有main方法的类作为启动入口。你配置了多版本JAR编译后,同时存在两个全限定名相同的启动类:
- Java 8版本路径:
com/example/demo/DemoApplication.class - Java 11版本路径:
META-INF/versions/11/com/example/demo/DemoApplication.class
插件无法区分优先级,因此抛出匹配到多个候选主类的错误。
解决方案
无需配置Profile,只需要给spring-boot-maven-plugin显式指定主类的全限定名即可。多版本JAR的类加载机制会保证运行时JDK自动选择匹配当前版本的启动类,无需额外处理。
修改后的spring-boot-maven-plugin配置如下:
<plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <!-- 显式指定主类全限定名,避免插件扫描匹配到多个候选类 --> <mainClass>com.example.demo.DemoApplication</mainClass> </configuration> </plugin>
说明
该配置完全兼容多版本JAR的运行逻辑:
- 用Java 8运行时,会自动加载根路径下的Java 8版本
DemoApplication - 用Java 11及以上版本运行时,会自动优先加载
META-INF/versions/11下的Java 11版本DemoApplication
内容的提问来源于stack exchange,提问作者utkarsh jha
相关产品推荐
相关产品推荐

