Spring Boot WAR包命令行启动失败,内嵌Tomcat依赖冲突求助
看起来你碰到了Spring Boot内嵌Tomcat和Google OAuth依赖冲突的典型问题,这个NoSuchMethodError本质是JVM加载了错误版本的Tomcat类,导致找不到对应的方法。下面是具体的分析和解决步骤:
问题根源
Spring Boot 1.5.9.RELEASE默认依赖的Tomcat版本是8.5.23,而你的google-oauth-client-jetty依赖里包含了Jetty容器相关的类,这些类和内嵌Tomcat的类产生了冲突;另外可能存在间接引入的低版本Tomcat类,导致StandardJarScanner的方法不匹配。
具体解决方案
1. 修正Jetty依赖的排除规则
你之前尝试排除Jetty但写错了groupId,Jetty的官方groupId是org.eclipse.jetty,修改google-oauth-client-jetty的依赖配置,彻底排除Jetty相关组件:
<dependency> <groupId>com.google.oauth-client</groupId> <artifactId>google-oauth-client-jetty</artifactId> <version>1.23.0</version> <exclusions> <exclusion> <groupId>org.eclipse.jetty</groupId> <artifactId>*</artifactId> </exclusion> <exclusion> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> </exclusion> </exclusions> </dependency>
这样就能避免Jetty和Tomcat容器的冲突。
2. 锁定Tomcat版本确保一致性
在pom.xml的<properties>节点添加Tomcat版本,和Spring Boot 1.5.9对应的版本保持一致,防止其他依赖引入不同版本的Tomcat类:
<properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <tomcat.version>8.5.23</tomcat.version> </properties>
3. 排查依赖树定位冲突
执行Maven命令查看依赖树,精准找到引入冲突Tomcat类的依赖:
mvn dependency:tree -Dverbose -Dincludes=org.apache.tomcat
根据输出结果,找到冲突的依赖项,然后针对性地排除它。
4. 重新打包验证
修改完成后,执行打包命令:
mvn clean package
再用java -jar myApp.war启动应用,检查报错是否消失。
额外方案:改用外部Tomcat(如果不需要内嵌容器)
如果你的应用最终要部署到外部Tomcat服务器,可以直接排除内嵌Tomcat依赖,避免容器冲突:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency>
这样打包后的WAR可以直接部署到外部Tomcat,无需用java -jar启动。
内容的提问来源于stack exchange,提问作者Arun

