解压重打包Spring Boot FatJar后启动失败:请求映射冲突
环境信息
- Ubuntu 15.8
- Spring Boot版本:2.7.14
操作步骤
- 解压Spring Boot FatJar:
jar -xf a.jar
- 重新打包:
jar cf0M a.jar BOOT-INF META-INF org
- 启动应用:
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笔记本上执行相同操作却能正常启动,怀疑是类路径相关问题。
排查与解决方案
- 调整打包目录顺序
Ubuntu下的jar命令对目录顺序敏感,当前打包命令将BOOT-INF放在最前,可能导致Spring Boot加载时重复扫描Controller类。修改打包命令,把META-INF放在首位:
jar cf0M a.jar META-INF BOOT-INF org
META-INF中的MANIFEST.MF是Spring Boot启动的核心配置,优先打包它能保证类加载顺序正确。
- 检查解压目录是否存在重复类
执行以下命令查找是否有重复的CodegenTableController.class文件:
find ./a -name "CodegenTableController.class"
若发现多个结果,说明解压或打包过程中引入了重复类,删除多余文件后重新打包。
- 使用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,避免手动操作带来的结构问题。
- 对齐JDK版本
检查Ubuntu环境的JDK版本是否与RedHat、Windows一致:
java -version
不同JDK版本对类加载的逻辑可能存在差异,切换到与原环境相同的JDK版本后重试启动。
内容的提问来源于stack exchange,提问作者ki Lo
相关产品推荐
相关产品推荐

