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.Finalresteasy-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的主要内容,如果未能解决你的问题,请参考以下文章

Jakarta EE 2020战果总结

如何在我的 Eclipse 项目中导入 javax.servlet / jakarta.servlet API?

Wildfly Undertow:jakarta.servlets.Servlet 没有实现 javax.servlet.Servlet

springboot中的配置文件信息

springboot中的配置文件信息

Spring 6.0 要来了,太强了!