Java 11下App Engine本地服务器mvn appengine:run运行报错求助
问题分析与解决方案
核心问题
出现java.lang.NoClassDefFoundError: jakarta/servlet/Filter错误的原因是:
- 项目混用了Jakarta EE 9+依赖(如Jersey 3.x)和旧版Java EE 8依赖(如javax.ws.rs、Objectify 5.x),导致Servlet API包路径冲突(
jakarta.servletvsjavax.servlet)。 - App Engine SDK和Maven插件版本过旧,不支持Jakarta EE 9+规范。
- 存在重复的JAXB依赖,引发类路径混乱。
具体修复步骤
1. 更新App Engine相关依赖与插件
将旧版SDK和插件替换为支持Jakarta EE 9+的版本:
<!-- App Engine SDK --> <dependency> <groupId>com.google.appengine</groupId> <artifactId>appengine-api-1.0-sdk</artifactId> <version>2.4.0</version> </dependency> <!-- App Engine Maven Plugin --> <plugin> <groupId>com.google.cloud.tools</groupId> <artifactId>appengine-maven-plugin</artifactId> <version>2.5.0</version> <configuration> <projectId>cardgamesserver</projectId> <version>1</version> <cloudSdkVersion>429.0.0</cloudSdkVersion> <gcloudMode>beta</gcloudMode> </configuration> </plugin>
2. 统一Jakarta EE依赖
替换旧版Java EE依赖为Jakarta EE对应版本:
- 移除
javax.ws.rs:javax.ws.rs-api,添加Jakarta版本:
<dependency> <groupId>jakarta.ws.rs</groupId> <artifactId>jakarta.ws.rs-api</artifactId> <version>3.1.1</version> </dependency>
- 清理重复的JAXB依赖,仅保留Jakarta规范和GlassFish实现:
<!-- 保留这两个即可 --> <dependency> <groupId>jakarta.xml.bind</groupId> <artifactId>jakarta.xml.bind-api</artifactId> <version>4.0.0</version> </dependency> <dependency> <groupId>org.glassfish.jaxb</groupId> <artifactId>jaxb-runtime</artifactId> <version>4.0.2</version> </dependency> <!-- 移除以下依赖 --> <!-- <dependency> <groupId>javax.xml.bind</groupId> <artifactId>jaxb-api</artifactId> <version>2.3.0</version> </dependency> <dependency> <groupId>com.sun.xml.bind</groupId> <artifactId>jaxb-core</artifactId> <version>4.0.2</version> </dependency> <dependency> <groupId>com.sun.xml.bind</groupId> <artifactId>jaxb-impl</artifactId> <version>4.0.2</version> </dependency> -->
3. 更新Objectify至Jakarta兼容版本
旧版Objectify 5.x使用javax.servlet,需替换为支持jakarta.servlet的版本:
<dependency> <groupId>com.googlecode.objectify</groupId> <artifactId>objectify</artifactId> <version>7.1.0</version> </dependency>
4. 更新Maven编译与打包插件
适配Java 11的最新插件版本:
<!-- Maven Compiler Plugin --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.11.0</version> <configuration> <source>11</source> <target>11</target> <encoding>UTF-8</encoding> </configuration> </plugin> <!-- Maven War Plugin --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <version>3.3.2</version> </plugin>
验证修复
执行以下命令清理并重新构建项目:
mvn clean install mvn appengine:run
内容的提问来源于stack exchange,提问作者Tim Cobra
相关产品推荐
相关产品推荐

