Jakarta ee 应用程序最佳实践:是否应该使用特定于容器的实现?
Jakarta ee application best practice: should one use container-specific implementations?
我正在构建我的第一个 Jakarta ee 8 应用程序。实际上我来自 Spring-Framework 背景,所以我专注于关键差异和最佳实践。我读到 Glassfish、Wildfly、JBoss EAP 等提供 Jakarta ee 规范的实现。这就提出了问题:
Would the application be dependent on the server it runs on? If an upgrade or change of the application server is necessary, should one consider incompatibility bugs?
我会使用以下示例使问题更具体。
我使用 hello world JAX-RS Web 服务创建了两个版本的 Web 应用程序。它 运行 在 JBoss EAP 7.2.2 上。 第一个 pom 文件看起来像
<dependency>
<groupId>jakarta.platform</groupId>
<artifactId>jakarta.jakartaee-api</artifactId>
<version>8.0.0</version>
<scope>provided</scope>
</dependency>
第二个pom文件
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.wildfly.bom</groupId>
<artifactId>wildfly-jakartaee8-with-tools</artifactId>
<version>${version.jboss.bom}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
....
<dependency>
<groupId>org.jboss.spec.javax.ws.rs</groupId>
<artifactId>jboss-jaxrs-api_2.1_spec</artifactId>
<scope>provided</scope>
</dependency>
根据以下 link>:http://www.mastertheboss.com/javaee/jakarta-ee/getting-started-with-jakarta-ee,如果想使用 Jakarta ee 的 Wildfly 扩展,则应使用第二个 pom 。
运行以上申请
- JBoss EAP -> EasyREST(JBoss JAX-RS 的实现)将发挥作用。
- 将使用 Glassfish -> Jersey。应用2不会运行?
- 在 Tomcat -> 两者都不起作用,因为没有提供实现。
我知道我可以在我的 pom 中包含一个特定的 JAX-RS 库作为依赖项并且 运行 容器无关。但是如果我 运行 在像 JBoss EAP 或 Glassfish 这样的企业应用程序服务器上,那会是最佳实践吗?同时我还在考虑服务器的可移植性。
注意: 我认为当一个人采用将所有实现作为显式依赖项包含在 WAR 中的方法时(例如特定版本的 easyrest 或 Jersey),那么一个应该考虑切换到更轻量级的 servlet 容器,如 Tomcat,因为在 Exnterprise 应用程序服务器上 运行ning 没有使用其功能的好处。我在这里谈论的是 JAX-RS 示例。当然,当需要其他 J2EE 特性时,例如EJB tomcat 肯定会被排除在外。
每当您使用特定于供应商的功能(如 WildFly 的 RESTEasy 依赖项)时,您都无法轻松地将您的应用程序移植到不同的应用程序服务器(例如 Payara/Glassfish/Open Liberty)。
作为最佳实践,只需从 Jakarta EE API 依赖项开始:
<dependency>
<groupId>jakarta.platform</groupId>
<artifactId>jakarta.jakartaee-api</artifactId>
<version>8.0.0</version>
<scope>provided</scope>
</dependency>
这包括 JAX-RS 2.1 规范,所有应用程序服务器都支持开箱即用。如果你只是使用它,你应该能够轻松地将你的应用程序移植到不同的服务器。
JAX-RS 2.1 specification covers 很多功能,这大概就够用了。
可能存在一些边缘情况,其中规范未提供易于使用的解决方案,您可能希望包括特定于供应商的实现,这不是正式 JAX-RS 规范的一部分。
一个很好的例子是缺少对 JAX-RS 的 MultiPart
数据的支持,例如将文件上传到您的后端。如果您将以下内容导入 Maven 项目,RESTEasy 会为此提供解决方案:
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-multipart-provider</artifactId>
<version>3.6.3.Final</version>
<scope>provided</scope>
</dependency>
这里的缺点是,一旦你使用了任何不是来自 javax.ws.rs
/jakarta.ws.rs
的导入,你就在使用规范之外的东西。
另一方面,您也应该考虑一下您切换应用服务器的可能性有多大。
更新:
What if e.g. the upgraded server implementation is still not bug-free?
没有人知道实施是否没有错误。升级服务器版本时,您仍应计划一些时间 verify/test。如果您依赖普通的 Jakarta EE 8 规范,情况也是如此。通常,服务器供应商还投入时间测试所有内容(拥有大型测试套件),并且可能已经找到一些要修复的错误。但是,您仍然不能 100% 确定升级服务器后一切都没有错误。
说到升级应用程序服务器和 JAX-RS 后的错误,我在 Payara 遇到过一个问题,我的所有 JAX-RS 请求过滤器都针对传入请求执行了两次。
顺便说一句。你不应该考虑 Tomcat。 Tomcat 是一个 只是 一个 servlet 容器,而不是一个完全兼容 Jakarta EE 的应用程序服务器。在 Jakarta EE 主页上,大家可以看看 Jakarta EE 8 compatible servers。
我正在构建我的第一个 Jakarta ee 8 应用程序。实际上我来自 Spring-Framework 背景,所以我专注于关键差异和最佳实践。我读到 Glassfish、Wildfly、JBoss EAP 等提供 Jakarta ee 规范的实现。这就提出了问题:
Would the application be dependent on the server it runs on? If an upgrade or change of the application server is necessary, should one consider incompatibility bugs?
我会使用以下示例使问题更具体。
我使用 hello world JAX-RS Web 服务创建了两个版本的 Web 应用程序。它 运行 在 JBoss EAP 7.2.2 上。 第一个 pom 文件看起来像
<dependency>
<groupId>jakarta.platform</groupId>
<artifactId>jakarta.jakartaee-api</artifactId>
<version>8.0.0</version>
<scope>provided</scope>
</dependency>
第二个pom文件
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.wildfly.bom</groupId>
<artifactId>wildfly-jakartaee8-with-tools</artifactId>
<version>${version.jboss.bom}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
....
<dependency>
<groupId>org.jboss.spec.javax.ws.rs</groupId>
<artifactId>jboss-jaxrs-api_2.1_spec</artifactId>
<scope>provided</scope>
</dependency>
根据以下 link>:http://www.mastertheboss.com/javaee/jakarta-ee/getting-started-with-jakarta-ee,如果想使用 Jakarta ee 的 Wildfly 扩展,则应使用第二个 pom 。
运行以上申请
- JBoss EAP -> EasyREST(JBoss JAX-RS 的实现)将发挥作用。
- 将使用 Glassfish -> Jersey。应用2不会运行?
- 在 Tomcat -> 两者都不起作用,因为没有提供实现。
我知道我可以在我的 pom 中包含一个特定的 JAX-RS 库作为依赖项并且 运行 容器无关。但是如果我 运行 在像 JBoss EAP 或 Glassfish 这样的企业应用程序服务器上,那会是最佳实践吗?同时我还在考虑服务器的可移植性。
注意: 我认为当一个人采用将所有实现作为显式依赖项包含在 WAR 中的方法时(例如特定版本的 easyrest 或 Jersey),那么一个应该考虑切换到更轻量级的 servlet 容器,如 Tomcat,因为在 Exnterprise 应用程序服务器上 运行ning 没有使用其功能的好处。我在这里谈论的是 JAX-RS 示例。当然,当需要其他 J2EE 特性时,例如EJB tomcat 肯定会被排除在外。
每当您使用特定于供应商的功能(如 WildFly 的 RESTEasy 依赖项)时,您都无法轻松地将您的应用程序移植到不同的应用程序服务器(例如 Payara/Glassfish/Open Liberty)。
作为最佳实践,只需从 Jakarta EE API 依赖项开始:
<dependency>
<groupId>jakarta.platform</groupId>
<artifactId>jakarta.jakartaee-api</artifactId>
<version>8.0.0</version>
<scope>provided</scope>
</dependency>
这包括 JAX-RS 2.1 规范,所有应用程序服务器都支持开箱即用。如果你只是使用它,你应该能够轻松地将你的应用程序移植到不同的服务器。
JAX-RS 2.1 specification covers 很多功能,这大概就够用了。
可能存在一些边缘情况,其中规范未提供易于使用的解决方案,您可能希望包括特定于供应商的实现,这不是正式 JAX-RS 规范的一部分。
一个很好的例子是缺少对 JAX-RS 的 MultiPart
数据的支持,例如将文件上传到您的后端。如果您将以下内容导入 Maven 项目,RESTEasy 会为此提供解决方案:
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-multipart-provider</artifactId>
<version>3.6.3.Final</version>
<scope>provided</scope>
</dependency>
这里的缺点是,一旦你使用了任何不是来自 javax.ws.rs
/jakarta.ws.rs
的导入,你就在使用规范之外的东西。
另一方面,您也应该考虑一下您切换应用服务器的可能性有多大。
更新:
What if e.g. the upgraded server implementation is still not bug-free?
没有人知道实施是否没有错误。升级服务器版本时,您仍应计划一些时间 verify/test。如果您依赖普通的 Jakarta EE 8 规范,情况也是如此。通常,服务器供应商还投入时间测试所有内容(拥有大型测试套件),并且可能已经找到一些要修复的错误。但是,您仍然不能 100% 确定升级服务器后一切都没有错误。
说到升级应用程序服务器和 JAX-RS 后的错误,我在 Payara 遇到过一个问题,我的所有 JAX-RS 请求过滤器都针对传入请求执行了两次。
顺便说一句。你不应该考虑 Tomcat。 Tomcat 是一个 只是 一个 servlet 容器,而不是一个完全兼容 Jakarta EE 的应用程序服务器。在 Jakarta EE 主页上,大家可以看看 Jakarta EE 8 compatible servers。