如何在Quarkus 3/Undertow中绕过excluded-artifacts引入javax.servlet-api?
解决Quarkus 3与旧javax.servlet依赖兼容的方案
以下是无需升级旧库的可行解决办法:
1. 使用Felix提供的javax.servlet-api替代官方构件
Quarkus Undertow扩展仅排除了javax.servlet:javax.servlet-api,你可以引入Felix维护的同API实现,它的groupId不同,不会被自动排除:
<dependency> <groupId>org.apache.felix.http</groupId> <artifactId>org.apache.felix.http.javax.servlet-api</artifactId> <version>4.0.1</version> <scope>runtime</scope> </dependency>
这个构件和官方javax.servlet-api的API完全一致,能满足org.apache.felix.http.wrappers的运行时依赖需求。
2. 在pom.xml中强制覆盖Quarkus的排除规则
通过Maven的依赖管理,强制引入javax.servlet:javax.servlet-api并取消Quarkus的排除配置:
<dependencyManagement> <dependencies> <dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-undertow</artifactId> <version>${quarkus.version}</version> <exclusions> <exclusion> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> </exclusion> </exclusions> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.1</version> <scope>runtime</scope> </dependency> </dependencies>
这种方式直接取消Quarkus对该依赖的排除,确保运行时能加载到javax.servlet的API类。
3. 字节码增强替换命名空间
使用字节码处理工具(比如Byte Buddy),在构建阶段自动将旧库中的javax.servlet包路径替换为jakarta.servlet。你可以在Maven中配置net.bytebuddy:byte-buddy-maven-plugin,对旧依赖的字节码进行批量修改,这样旧库就能直接适配Quarkus的Jakarta环境,无需额外引入javax API。
内容的提问来源于stack exchange,提问作者Andrei Damian-Fekete
相关产品推荐
相关产品推荐

