如何避免Java EE和Jakarta EE之间的兼容性问题?

问题描述 投票:0回答:1

Oracle 决定将 Java EE 捐赠给 Eclipse 基金会后,更名为 Jakarta EE

这样,

javax
命名空间更改为
jakarta

为了避免从 Java EE 更改为 Jakarta EE 带来的兼容性问题,需要注意什么?

java jakarta-ee compatibility
1个回答
0
投票

不要混合 Java EE 和 Jakarta EE 依赖项

您不能同时使用 Java EE 和 Jakarta EE。您必须使用其中之一。
如果项目使用 Java EE,则项目中不应存在任何 Jakarta EE 依赖项。

以下是 Java EE/Jakarta 依赖项的一些示例(采用

group.id:artifact-id
表示法):

Java EE 依赖 Jakarta EE 依赖
javax.servlet:javax.servlet-api
jakarta.servlet:jakarta.servlet-api
javax.persistence:javax.persistence-api
jakarta.persistence:jakarta.persistence-api
javax.xml.bind:jaxb-api
jakarta.xml.bind:jakarta.xml.bind-api
javax.validation:validation-api
jakarta.validation:jakarta.validation-api
javax.mail:javax.mail-api
jakarta.mail:jakarta.mail-api

您不应在同一个项目中同时拥有

javax
jakarta
依赖项。

您可以使用

mvn dependency:list
(与 Maven 一起使用)或
gradlew dependencies
(与 Gradle 一起使用)来检查依赖关系。

其他/传递依赖

您的项目可能使用为 Java EE 或 Jakarta EE 编写的依赖项。
您需要确保您使用的这些依赖项的版本与您正在使用的规范相匹配。

此表提供了在某些版本中使用 Java EE 和在其他版本中使用 Jakarta EE 的依赖项示例:

依赖性 支持 Java EE 的版本 支持 Jakarta EE 的版本
春季启动 <= 2.x >= 3.x
春天 <= 5.x >= 6.x
休眠 <= 5.x >= 6.x

包名

随着名称

Java EE
更改为
Jakarta EE
,所有 Java EE 类型都从
javax
包移至
jakarta
(例如,
javax.servlet
更改为
jakarta.servlet
)。

如果项目使用 Java EE,则不应包含任何

jakarta.*
导入,如果使用 Jakarta EE,则不应使用
javax.*
中的任何 Java EE 类。

有一些工具可用于更改项目中的所有导入和其他类型引用。

配置文件

某些配置文件(例如

persistence.xml
)可能会有所不同,具体取决于使用的是 Java EE 还是 Jakarta。

如果配置文件引用以

javax
开头的内容,则这通常属于 Java EE,而以
jakarta
开头的引用通常属于 Jakarta EE 项目。

这是 Java EE 和 Jakarta EE 的示例

persistence.xml
文件:

<!-- This is for Java EE -->
<persistence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
    version="2.0" xmlns="http://java.sun.com/xml/ns/persistence">

    <persistence-unit name="MyPersistenceUnit" transaction-type="JTA">
        <properties>
            <property name="javax.persistence.jdbc.url" value="jdbc:my-database-url" />
        </properties>
    </persistence-unit>
</persistence>
<!-- This is for Jakarta EE -->
<persistence xmlns="https://jakarta.ee/xml/ns/persistence"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="https://jakarta.ee/xml/ns/persistence https://jakarta.ee/xml/ns/persistence/persistence_3_0.xsd"
             version="3.0">
    <persistence-unit name="MyPersistenceUnit" transaction-type="JTA">
        <properties>
            <property name="jakarta.persistence.jdbc.url" value="jdbc:my-database-url" />
        </properties>
    </persistence-unit>
</persistence>

其他配置文件可能需要类似的更改。

应用服务器/容器

Java EE 项目应部署到支持 Java EE 的应用程序服务器/Web 容器,Jakarta EE 项目应部署到支持 Jakarta EE 的应用程序服务器/Web 容器。

例如,Tomcat <=9 uses Java EE while Tomcat >=10 使用 Jakarta EE

不兼容可能会出现哪些问题

如果项目引用不可用的类,则可能会发生

ClassNotFoundException
s/
NoClassDefFoundError
s。

容器可能由于以下原因找不到某些元素(例如 servlet):容器扫描

javax.servlet.annotation.WebServlet
但 servlet 被注释为
jakarta.servlet.annotation.WebServlet

应用程序可能无法正确获取某些配置。

当然,可能还会有很多其他问题,具体取决于到底做错了什么。

© www.soinside.com 2019 - 2024. All rights reserved.