【问题标题】:Resource annotations in Servlets are only working with Java 8, not with Java 11 on a Tomcat 8 serverServlet 中的资源注释仅适用于 Java 8,不适用于 Tomcat 8 服务器上的 Java 11
【发布时间】:2023-04-07 19:54:01
【问题描述】:

我开发了一个 HTTP servlet,它实现 MessageListener 并使用 javax.jms.ConnectionFactoy 连接到基于 JMS 的 MQ 系统。

连接工厂通过 Resource 注解注入到 servlet。

@Resource(name = "jms/ConnectionFactory")
private ConnectionFactory connectionFactory;

资源在 context.xml 配置文件中定义。

我的经验是,当我使用 Java 11 编译 servlet 时,javax.annotation.Ressource 被简单地忽略了,而我仍然可以直接在上下文中根据其名称查找资源。 但是,当我使用 Java 8 编译它时,资源被注入到 servlet 中的注释字段中。

谁能解释一下?

另外一点是,当从 Java EE 迁移到 Jakarta EE 时,javax 命名空间被 jakarate 取代。大多数 JMS 库仍然使用 javax.jms.* 接口实现,例如 ConnectionFactory、Queue 等。

有没有人体验过兼容性如何,或者是否有必要重新实现 JMS 库?

【问题讨论】:

标签: java servlets annotations tomcat8


【解决方案1】:

tl;博士

对于 Java 11 部署,使用 Tomcat 10.1.x、Jakarta EE 包命名、Servlet 6 API 和 Jakarta Messaging 3.1 API。

早期版本也可以在 Java 11 上运行,但这些版本是专门为 Java 11 构建的,作为最低要求。

这种组合可能适用于 Java 17 和 Java 11。Java 17 是最新的长期支持 (LTS) 版本。虽然 Jakarta EE 中并未正式要求支持,但各个团队似乎都希望他们的最新版本能够在 Java 17 上良好运行。

为 Java 11 使用 Tomcat 版本 10.1

根据Apache Tomcat Versions,Tomcat 10.1 版本支持 Java 11,而 9 和 10.0 版本针对 Java 8。

包名

您需要将import 语句从javax.*package 更改为jakarta.*。包命名的这种变化是由于从 Oracle 过渡到 Eclipse Foundation 作为Jakarta EE 技术(以前称为 Java EE)的管理者。

Servlet API

切换到适当版本的 Servlet API,版本 6。请参阅 Servlet specifications page

消息 API

请注意,JMS 已变为 Jakarta Messaging。您需要相应地调整您的 import 语句和版本号。见specifications page

同样,更新您的 Jakarta Messaging 实施。

【讨论】:

  • Tomcat 版本支持“任何符合要求的稳定 Java 版本”。这意味着 OP 可以安全地将 Tomcat 9 与 Java 11 一起使用,直到他最喜欢的 JMS 实现切换到 JMS 3.0。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-09
  • 2017-06-03
  • 2017-12-21
  • 1970-01-01
  • 2018-05-03
  • 1970-01-01
相关资源
最近更新 更多