Tomcat、焊接 3、CDI 2、焊接终端监听器

Tomcat, WELD 3, CDI 2, WeldTerminalListener

正在尝试使用 CDI 2.0 设置一个 Maven 网络项目,它应该 运行 在 Tomcat 8.5 上。所以我必须安装 jboss WELD 3。

What is the relation between Weld, CDI and Java EE versions?

这里有 POM 声明(仅 "weld-servlet-core")...

WELD - POM declaration (docs.jboss.org)

我在 "WeldTerminalListener" 中遇到错误,在 web.xml 中这样声明:

<!-- This listener should always be the last registered listener -->
<listener>
    <listener-class>org.jboss.weld.servlet.WeldTerminalListener</listener-class>
</listener>

错误:java.lang.ClassNotFoundException:org.jboss.weld.servlet.WeldTerminalListener


如果我使用以下 POM 声明,它工作正常:

<dependency>
  <groupId>org.jboss.weld.servlet</groupId>
  <artifactId>weld-servlet</artifactId>
  <version>2.3.5.Final</version>
</dependency>

weld-servlet(不带“-core”)3 仅作为 alpha 可用。版本 2 不支持 CDI 2.0。

那么我需要 POM 中的哪个依赖项才能获得它运行?

关于weld-servlet-core库的版本3.x,好像是class 不同。在浏览库 jar 文件后,我发现 class 的全名如下:

<listener>
    <listener-class>org.jboss.weld.module.web.servlet.WeldTerminalListener</listener-class>
</listener>

Weld 3 更改了一些工件名称。这是 shaded 工件发生了变化,参见 this part of documentation

即,在 Weld 2 中 weld-servlet 是此 JAR 的阴影版本,因此在 Weld 3 中等效于 weld-servlet-shaded

在您的情况下,您可以使用此阴影版本 (org.jboss.weld.servlet:weld-servlet-shaded) 或核心版本 (org.jboss.weld.servlet:weld-servlet-core)。

至于监听器的class,你可以check yourself on GH,但故事是它也被改变了(向JDK 9+中的包冲突问好)。 现在是:

<listener>
    <listener-class>org.jboss.weld.module.web.servlet.WeldTerminalListener</listener-class>
</listener>

焊接文档(适用于 3.0。3.Final)有关于此的错误信息。 我会确保它在下一个版本中得到纠正(感谢您指出这一点)。