jakarta / javax 命名空间下的 Weld 和 Undertow
Posted
技术标签:
【中文标题】jakarta / javax 命名空间下的 Weld 和 Undertow【英文标题】:Weld and Undertow under jakarta / javax namespaces 【发布时间】:2021-12-02 04:42:28 【问题描述】:我正在升级我的 JEE 应用程序中的一些库,希望能解决一个奇怪的问题(请参阅JAX-RS integration test with Undertow failing in Jenkins but working locally)
在升级 restEasy 和 Weld 时,我的测试失败了,因为命名空间从 javax.servlet.ServletContext
更改为 jakarta.servlet.ServletContext
导致出现一些“内部”编译问题:
在我的依赖项中:
在weld-servlet-core 4.0.2.Final 中:
package org.jboss.weld.environment.undertow;
import io.undertow.servlet.ServletExtension;
import jakarta.servlet.ServletContext;
...
public class WeldServletExtension implements ServletExtension
@Override
public void handleDeployment(DeploymentInfo deploymentInfo, ServletContext servletContext)
...
在 undertow-servlet 2.2.7.Final 中:
package io.undertow.servlet;
import io.undertow.servlet.api.DeploymentInfo;
import javax.servlet.ServletContext;
public interface ServletExtension
void handleDeployment(final DeploymentInfo deploymentInfo, final ServletContext servletContext);
这行不通,因为 WeldServletExtension 实际上没有在该设置中实现 ServletExtension:它使用 jakarta.servlet.ServletContext
,而接口需要使用 javax.servlet.ServletContext
undertow-servlet:2.2.7.Final
由 resteasy-undertow:5.0.0.Beta1
传递(最新版本,2021 年 10 月起),我添加自己 weld-servlet-core:4.0.2.Final
(也是最新版本:2021 年 7 月起)
查看 ServletExtension in its main branch,Undertow 仍在使用 javax.*
命名空间,而不是 jakarta.*
- 自 2014 年以来一直没有更新。所以即使我使用的是 Undertow 最新版本(2.2.12.Final),我还是会有问题
所以我有点困惑......这里的诀窍是什么?升级到 RestEasy 5.x 并使用 Weld 后,我们不能使用 Undertow 吗?
【问题讨论】:
目前没有 RESTEasy 的 Jakarta REST 3.0 实现。虽然这即将到来,但没有官方日期自动取款机。我会说一个月内至少会有一个 alpha 版本。 【参考方案1】:Undertow 正在发布一个使用 EE 9 命名空间的特殊独立工件。
它的 GAV 略有不同 - io.undertow:undertow-servlet-jakartaee9:2.2.12.Final
它在 Maven Central 中可用,您可以在 see here 中使用。 Weld 4其实就是在用这个神器,可以看pom.xml。
这应该是你的谜题中缺少的部分。
【讨论】:
谢谢,它有帮助。我通过排除 undertow-servlet 并添加另一个,我走得更远了。 testImplementation ('org.jboss.resteasy:resteasy-undertow:5.0.0.Beta1') exclude module: 'undertow-servlet' testImplementation 'io.undertow:undertow-servlet-jakartaee9:2.2.12.Final' 但现在,它进一步失败并出现类似错误,抱怨 org.jboss.resteasy.plugins.server.servlet.HttpServlet30Dispatcher (来自 resteasy-core 5.0.0.Beta,实现 javax.servlet.Servlet 而不是 jakarta.servlet.Servlet ..这是一个永无止境的故事,对吧? 好吧,IMO 你还需要一个不同版本的resteasy-undertow
,例如有些使用jakarta
命名空间。但是,这超出了我的知识范围,因此我无法给您明确的答案。以上是关于jakarta / javax 命名空间下的 Weld 和 Undertow的主要内容,如果未能解决你的问题,请参考以下文章
如何在我的 Eclipse 项目中导入 javax.servlet / jakarta.servlet API?
Wildfly Undertow:jakarta.servlets.Servlet 没有实现 javax.servlet.Servlet