从Vaadin 23.3.5迁移至24.0.1时Quarkus启动NoClassDefFoundError问题
Quarkus启动报错:找不到javax.servlet.annotation.WebFilter类
环境配置
maven.compiler.source: 17 vaadin.version: 24.0.1 quarkus.version: 2.16.0.Final
报错日志
ERROR [io.qua.dep.dev.IsolatedDevModeMain] (main) Failed to start quarkus: java.lang.NoClassDefFoundError: javax/servlet/annotation/WebFilter at io.quarkus.undertow.deployment.UndertowBuildStep.(UndertowBuildStep.java:141) at java.base/java.lang.Class.forName0(Native Method) at java.base/java.lang.Class.forName(Class.java:467) at io.quarkus.deployment.util.ServiceUtil.classesNamedIn(ServiceUtil.java:29) at io.quarkus.deployment.ExtensionLoader.loadStepsFrom(ExtensionLoader.java:215) at io.quarkus.deployment.QuarkusAugmentor.run(QuarkusAugmentor.java:107) at io.quarkus.runner.bootstrap.AugmentActionImpl.runAugment(AugmentActionImpl.java:331) at io.quarkus.runner.bootstrap.AugmentActionImpl.createInitialRuntimeApplication(AugmentActionImpl.java:252) at io.quarkus.runner.bootstrap.AugmentActionImpl.createInitialRuntimeApplication(AugmentActionImpl.java:60) at io.quarkus.deployment.dev.IsolatedDevModeMain.firstStart(IsolatedDevModeMain.java:86) at io.quarkus.deployment.dev.IsolatedDevModeMain.accept(IsolatedDevModeMain.java:447) at io.quarkus.deployment.dev.IsolatedDevModeMain.accept(IsolatedDevModeMain.java:59) at io.quarkus.bootstrap.app.CuratedApplication.runInCl(CuratedApplication.java:149) at io.quarkus.bootstrap.app.CuratedApplication.runInAugmentClassLoader(CuratedApplication.java:104) at io.quarkus.deployment.dev.DevModeMain.start(DevModeMain.java:131) at io.quarkus.deployment.dev.DevModeMain.main(DevModeMain.java:62) Caused by: java.lang.ClassNotFoundException: javax.servlet.annotation.WebFilter at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641) at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:520) at io.quarkus.bootstrap.classloading.QuarkusClassLoader.loadClass(QuarkusClassLoader.java:516) at io.quarkus.bootstrap.classloading.QuarkusClassLoader.loadClass(QuarkusClassLoader.java:466) ... 16 more
错误原因
该错误源于找不到javax.servlet.annotation.WebFilter类,导致Quarkus启动流程中断。核心问题是Quarkus 2.16.0.Final基于Jakarta EE 9规范,该规范已将原Java EE中的javax.servlet包替换为jakarta.servlet包,项目中仍在引用旧的Java EE servlet API类,从而引发类缺失异常。
解决方法
引入正确的Quarkus Web依赖
在pom.xml中添加Quarkus官方Web扩展(默认包含Jakarta Servlet API):<dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-web</artifactId> </dependency>若已引入
quarkus-undertow,可直接使用,它包含Web扩展的核心功能。排查并排除依赖冲突
执行mvn dependency:tree命令,检查是否有依赖引入了旧的javax.servlet相关包。若发现冲突,通过exclusions标签排除:<dependency> <!-- 存在冲突的依赖 --> <groupId>xxx</groupId> <artifactId>xxx</artifactId> <exclusions> <exclusion> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> </exclusion> </exclusions> </dependency>验证Vaadin与Quarkus的集成依赖
Vaadin 24.0.1支持Quarkus 2.16.x,但需使用Vaadin官方的Quarkus集成依赖:<dependency> <groupId>com.vaadin</groupId> <artifactId>vaadin-quarkus-extension</artifactId> <version>${vaadin.version}</version> </dependency>
内容的提问来源于stack exchange,提问作者Maikel
相关产品推荐
相关产品推荐

