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

多版本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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 19:45:04