我有一个现有的 Java REST 服务,我正在尝试从 Tomcat8、Java8、Jersey(2.23) 和 Weld(2.4.8) 升级。我使用 Weld 进行 CDI,以便实例化我的服务类并将其注入到资源类中需要的位置。一切正常。我目前将此项目定义为 Gradle7 项目。
迁移到 Java17 似乎不需要任何更改。 迁移到 Tomcat9 只需要我从
javax.servlet:javax.servlet-api:3.+
更改为 jakarta.servlet:jakarta.servlet-api:4.+
。
我对 Jersey 和 Weld/CDI 感到困惑/困惑。
我也对
javax.ws.rs:javax.ws.rs-api:2.+
与 jakarta.ws.rs:jakarta.ws.rs-api:3.+
感到困惑。我很确定这与 Jersey 有关,并且只需要我将导入从 javax
切换到 jakarta
。
任何方向将不胜感激,因为我觉得我此时只是在旋转。
随着 Java EE / Jakarta EE 的发展,API 的版本也在发展。在某些时候,maven 工件名称从
javax
更改为 jakarta
,后来 java 包名称从 java
更改为 jakarta
。 8 有两个版本。
| EE Version | java package names | artifact names | Servlet | JAX-RS |
|-------------|--------------------|----------------|---------|--------|
| Java EE 7 | javax | javax | 3.1 | 2.0 |
| Java EE 8 | javax | javax | 4.0 | 2.1 |
| Jakarta EE 8| javax | jakarta | 4.0.4 | 2.1.6 |
| Jakarta EE 9| jakarta | jakarta | 5.0 | 3.0 |
|Jakarta EE 10| jakarta | jakarta | 6.0 | 3.1 |
请参阅 Tomcat 版本矩阵。您可以在那里找到受支持的 servlet 版本。由此,可以得出所需的 Jersey、CDI 和 Weld 版本。该表可能如下所示:
| Tomcat | Servlet | javax vs. jakarta | Jersey | JAX-RS | CDI | Weld |
|:------:|:-------:|:-----------------:|:------:|:------:|:---:|:----:|
| 8.x | 3.1 | javax | 2.25.1 | 2.0 | 2.0 | 3.0 |
| 9.x | 4.0 | javax/jakarta | 2.26+ | 2.1 |2.0.2| 3.x |
| 10.0.x | 5.0 | jakarta | 3.0.x | 3.0 | 3.0 | 4.x |
| 10.1.x | 6.0 | jakarta | 3.1.x | 3.1 | 4.0 | 5.x |
Jersey 从 2.34 开始部分支持 JDK 17,2.35 中更好。
所以你需要:
| Tomcat | Servlet | JAX-RS | Jersey|
------------------------------------------------------------------------
| 9.x | jakarta.servlet-api:4.0.4 | jakarta.ws.rs-api:2.1.6 | 2.35+ |
| 10.0.x| jakarta.servlet-api:5 | jakarta.ws.rs-api:3.0 | 3.0.x |
| 10.1.x| jakarta.servlet-api:6 | jakarta.ws.rs-api:3.1 | 3.1.x |
请不要使用 Jersey 2.35,最好从修复的最新版本开始。