Spring Boot与Google OAuth Client依赖冲突问题求助
看起来你遇到的是Servlet API版本冲突导致的启动失败,核心原因是Google Calendar示例依赖的库引入了低版本的Servlet API,覆盖了Spring Boot内嵌容器所需的高版本API,才会出现NoSuchMethodError: javax.servlet.ServletContext.addServlet这个错误——这个方法是Servlet 3.0及以上版本才有的,低版本(比如2.5)没有这个方法。
下面是具体的解决步骤:
1. 排除Google依赖中的旧版Servlet API
Google的google-api-client-java6和google-api-client-jetty依赖会默认引入低版本的javax.servlet:servlet-api,我们需要在构建配置中主动排除这个依赖,让Spring Boot使用自己内嵌容器提供的高版本Servlet API。
Maven配置示例
在你的pom.xml中,给Google相关依赖添加排除规则:
<!-- Google Calendar Java6 依赖 --> <dependency> <groupId>com.google.api-client</groupId> <artifactId>google-api-client-java6</artifactId> <version>替换成你使用的版本</version> <exclusions> <exclusion> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> </exclusion> </exclusions> </dependency> <!-- Google Calendar Jetty 依赖 --> <dependency> <groupId>com.google.api-client</groupId> <artifactId>google-api-client-jetty</artifactId> <version>替换成你使用的版本</version> <exclusions> <exclusion> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> </exclusion> </exclusions> </dependency>
Gradle配置示例
如果使用Gradle,在build.gradle中添加排除:
implementation('com.google.api-client:google-api-client-java6:替换成你使用的版本') { exclude group: 'javax.servlet', module: 'servlet-api' } implementation('com.google.api-client:google-api-client-jetty:替换成你使用的版本') { exclude group: 'javax.servlet', module: 'servlet-api' }
2. 确认Spring Boot的Servlet API依赖
Spring Boot的spring-boot-starter-web依赖已经通过内嵌Tomcat(或其他容器)传递引入了符合要求的Servlet API,不需要你额外手动添加。排除掉Google依赖中的旧版API后,项目会自动使用Spring Boot提供的高版本API。
3. 验证依赖树(可选但推荐)
为了确保没有残留的低版本Servlet API,可以执行依赖树命令检查:
- Maven:
mvn dependency:tree - Gradle:
gradle dependencies
搜索输出中的javax.servlet:servlet-api,确认没有低版本的条目存在。
4. 恢复Google Calendar的OAuth代码
完成上述配置后,你就可以取消对AuthorizationCodeInstalledApp和LocalServerReceiver相关代码的注释了——依赖冲突解决后,Spring Boot能正常启动,同时Google Calendar的示例代码也能正常导入并运行。
如果是Spring Boot 3.x版本(使用Jakarta EE而非javax),你可能需要使用适配Jakarta的Google客户端版本(比如google-api-client-java6的最新版本),不过从你的错误信息来看,应该是Spring Boot 2.x的场景,上面的方案完全适用。
内容的提问来源于stack exchange,提问作者ITJscott

