部署WAR包至Tomcat7.0.57时遭遇NoSuchMethodError问题求助
解决Spring Boot WAR部署到Tomcat 7.0.57的NoSuchMethodError问题
这个错误的核心原因是Tomcat版本冲突:你的项目里依赖了Tomcat 7.0.82的嵌入式组件,但部署的服务器是Tomcat 7.0.57,两个版本中org.apache.tomcat.util.res.StringManager的getManager方法签名不一致,导致运行时找不到对应方法。再加上Spring Boot默认的嵌入式Tomcat依赖会打包进WAR,和外部Tomcat的类库冲突,才触发了这个异常。
下面是具体的修复步骤,直接修改你的build.gradle即可:
修改后的build.gradle配置
buildscript { repositories { mavenCentral() } dependencies { classpath("org.springframework.boot:spring-boot-gradle-plugin:1.1.10.RELEASE") } } group 'batch' version '1.0-SNAPSHOT' apply plugin: 'java' apply plugin: 'spring-boot' apply plugin: 'war' bootRun { addResources = true } war { baseName = 'Batch' version = '0.1.0' // 移除手动指定的Main-Class,Spring Boot插件会自动处理 } jar { manifest { attributes 'Main-Class': 'src.main.java.com.Application' } } sourceCompatibility = 1.7 targetCompatibility = 1.7 repositories { mavenCentral() } dependencies { compile group: 'org.springframework.boot', name: 'spring-boot-starter-web', version: '1.1.10.RELEASE' compile group: 'mysql', name: 'mysql-connector-java', version: '5.1.24' compile group: 'org.json', name: 'json', version: '20180130' compile group: 'org.springframework.boot', name: 'spring-boot-starter-data-jpa', version: '1.1.10.RELEASE' compile group: 'javax.servlet', name: 'jstl', version: '1.2' // 把tomcat-embed-jasper版本改成和服务器一致的7.0.57 compile group: 'org.apache.tomcat.embed', name: 'tomcat-embed-jasper', version: '7.0.57' // 将嵌入式Tomcat依赖设为providedRuntime,打包时不包含,由外部Tomcat提供 providedRuntime group: 'org.springframework.boot', name: 'spring-boot-starter-tomcat', version: '1.1.10.RELEASE' //compile group: 'net.sourceforge.tess4j', name: 'tess4j', version: '4.0.2' //compile group: 'org.apache.poi', name: 'poi', version: '3.9' }
关键修改说明
- 调整
spring-boot-starter-tomcat的依赖范围:用providedRuntime替代compile,这样打包时不会把嵌入式Tomcat的类打进WAR包,避免和外部Tomcat的类库冲突。本地开发时这个依赖依然会被加载,不影响你在IntelliJ里运行项目。 - 统一Tomcat组件版本:把
tomcat-embed-jasper的版本从7.0.82改成7.0.57,和你部署的服务器版本完全一致,保证API签名匹配,解决NoSuchMethodError的根本问题。 - 移除多余的Main-Class配置:Spring Boot的
war插件会自动生成符合外部Tomcat部署要求的MANIFEST配置,手动指定的Main-Class不仅没用,还可能导致启动异常。
额外注意事项
- 修改完成后,先执行
clean任务清理旧的构建文件,再重新执行bootRepackage打包WAR。 - 部署前确保Tomcat 7.0.57的
webapps目录下没有旧的项目残留,避免缓存问题。
内容的提问来源于stack exchange,提问作者Explain Down Vote
相关产品推荐
相关产品推荐

