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

解压重打包Spring Boot FatJar后启动失败:请求映射冲突

环境信息

  • Ubuntu 15.8
  • Spring Boot版本:2.7.14

操作步骤

  1. 解压Spring Boot FatJar:
jar -xf a.jar 
  1. 重新打包:
jar cf0M a.jar BOOT-INF META-INF org
  1. 启动应用:
java -jar a.jar

报错信息

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'requestMappingHandlerMapping' defined in class path resource [org/springframework/boot/autoconfigure/web/servlet/WebMvcAutoConfiguration$EnableWebMvcConfiguration.class]: Invocation of init method failed; nested exception is java.lang.IllegalStateException: Ambiguous mapping. Cannot map 'codegenTableController' method 
cn.luo.yudao.module.infra.controller.admin.codegen.CodegenTableController#listByIds(Collection)
to {GET [/admin-api/infra/codegenTable]}: There is already 'codegenTableController' bean method
cn.luo.yudao.module.infra.controller.admin.codegen.CodegenTableController#exportExcel(Object, HttpServletResponse) mapped.
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1804)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:620)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542)
        at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335)
        at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
        at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333)
        at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208)
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:955)
        at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:921)
        at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:583)
        at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:147)
        at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:731)
        at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:408)
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:307)
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:1303)
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:1292)
        at cn.luo.yudao.ServerApplication.main(ServerApplication.java:27)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:49)
        at org.springframework.boot.loader.Launcher.launch(Launcher.java:108)
        at org.springframework.boot.loader.Launcher.launch(Launcher.java:58)
        at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:65)
Caused by: java.lang.IllegalStateException: Ambiguous mapping. Cannot map 'codegenTableController' method 
cn.luo.yudao.module.infra.controller.admin.codegen.CodegenTableController#listByIds(Collection)
to {GET [/admin-api/infra/codegenTable]}: There is already 'codegenTableController' bean method
cn.luo.yudao.module.infra.controller.admin.codegen.CodegenTableController#exportExcel(Object, HttpServletResponse) mapped.
        at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping$MappingRegistry.validateMethodMapping(AbstractHandlerMethodMapping.java:669)
        at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping$MappingRegistry.register(AbstractHandlerMethodMapping.java:635)
        at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.registerHandlerMethod(AbstractHandlerMethodMapping.java:332)
        at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping.registerHandlerMethod(RequestMappingHandlerMapping.java:420)
        at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping.registerHandlerMethod(RequestMappingHandlerMapping.java:76)
        at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.lambda$detectHandlerMethods$2(AbstractHandlerMethodMapping.java:299)
        at java.util.LinkedHashMap.forEach(LinkedHashMap.java:684)
        at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.detectHandlerMethods(AbstractHandlerMethodMapping.java:297)
        at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.processCandidateBean(AbstractHandlerMethodMapping.java:266)
        at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.initHandlerMethods(AbstractHandlerMethodMapping.java:225)
        at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.afterPropertiesSet(AbstractHandlerMethodMapping.java:213)
        at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping.afterPropertiesSet(RequestMappingHandlerMapping.java:205)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1863)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1800)
        ... 24 common frames omitted

问题补充

确认类路径下无同名类,原FatJar可正常启动。此前在RedHat环境对其他FatJar执行相同操作可正常运行,但Ubuntu环境下出现此问题,Windows 11笔记本上执行相同操作却能正常启动,怀疑是类路径相关问题。


排查与解决方案

  1. 调整打包目录顺序
    Ubuntu下的jar命令对目录顺序敏感,当前打包命令将BOOT-INF放在最前,可能导致Spring Boot加载时重复扫描Controller类。修改打包命令,把META-INF放在首位:
jar cf0M a.jar META-INF BOOT-INF org

META-INF中的MANIFEST.MF是Spring Boot启动的核心配置,优先打包它能保证类加载顺序正确。

  1. 检查解压目录是否存在重复类
    执行以下命令查找是否有重复的CodegenTableController.class文件:
find ./a -name "CodegenTableController.class"

若发现多个结果,说明解压或打包过程中引入了重复类,删除多余文件后重新打包。

  1. 使用Spring Boot官方工具修改Jar
    手动解压再打包容易破坏FatJar的内部结构,推荐使用spring-boot-loader-tools来修改Jar:
  • 在pom.xml中添加依赖:
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-loader-tools</artifactId>
        <version>2.7.14</version>
        <scope>provided</scope>
    </dependency>
    
  • 通过工具类操作Jar,避免手动操作带来的结构问题。
  1. 对齐JDK版本
    检查Ubuntu环境的JDK版本是否与RedHat、Windows一致:
java -version

不同JDK版本对类加载的逻辑可能存在差异,切换到与原环境相同的JDK版本后重试启动。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 06:47:03