Jakarta ee 雅加达ee应用程序最佳实践:是否应该使用特定于容器的实现?

Jakarta ee 雅加达ee应用程序最佳实践:是否应该使用特定于容器的实现?,jakarta-ee,Jakarta Ee,我正在构建我的第一个雅加达ee 8应用程序。事实上,我来自Spring框架背景,所以我将重点放在关键差异和最佳实践上。我读到Glassfish、Wildfly、JBoss EAP等提供了雅加达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

我正在构建我的第一个雅加达ee 8应用程序。事实上,我来自Spring框架背景,所以我将重点放在关键差异和最佳实践上。我读到Glassfish、Wildfly、JBoss EAP等提供了雅加达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>
<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>

雅加达平台
,如果要使用Jakarta ee的Wildfly扩展,则应使用第二个pom。

在上运行上述应用程序

  • JBoss EAP->EasyREST(JAX-RS的JBoss实现)将发挥作用
  • 将使用Glassfish->Jersey。应用程序2将不运行
  • 在Tomcat->上,两个ar都不工作,因为没有提供实现
我知道我可以在pom中包含一个特定的JAX-RS库作为依赖项,并独立于容器运行。但如果我在企业应用服务器上运行,比如JBoss EAP或Glassfish,这是一种最佳实践吗?同时,我仍然考虑服务器的可移植性


注意:我认为,当人们在战争中采用将所有实现作为显式依赖项包含的方法(例如,easyrest或Jersey的某些版本)时,应该考虑切换到一个更轻量级的servlet容器,如Tomcat,因为在ExEnterprise应用服务器上运行而不使用其功能是没有好处的。我在这里谈论的是JAX-RS示例。当然,当需要其他J2EE特性时,例如EJB tomcat,肯定会被排除在外

每当您使用特定于供应商的功能(如WildFly的RESTEasy dependencies)时,您都无法将应用程序轻松移植到不同的应用程序服务器(例如Payara/Glassfish/Open Liberty)

作为最佳实践,只需从雅加达EE API依赖项开始:

<dependency>
  <groupId>jakarta.platform</groupId>
  <artifactId>jakarta.jakartaee-api</artifactId>
  <version>8.0.0</version>
  <scope>provided</scope>
</dependency>
这里的缺点是,一旦您使用了不是来自
javax.ws.rs
/
jakarta.ws.rs
的任何导入,您就使用了规范之外的东西

另一方面,您还应该考虑切换应用程序服务器的可能性

更新:

如果升级后的服务器实现仍然没有bug,该怎么办

没有人知道一个实现是否没有bug。升级服务器版本时,您仍应计划一些时间进行验证/测试。如果您依赖简单的Jakarta EE 8规范,这也是正确的。一般来说,服务器供应商也会投入时间测试所有东西(有一个大的测试套件),并且可能已经找到一些需要修复的bug。但是,您仍然不能100%确定在升级服务器之后,一切都能正常工作

说到升级应用服务器和JAX-RS后的bug,我在Payara有过一次,我的所有JAX-RS请求过滤器都对传入的请求执行了两次


顺便说一句,你不应该考虑Tomcat。Tomcat只是一个servlet容器,而不是完全符合Jakarta EE的应用服务器。在雅加达EE主页上,您可以查看所有内容

Tomcat最初不是JEE服务器,所以它是一个坏例子。谢谢你的回答。您是对的,切换应用服务器并不常见,但我也考虑服务器升级。即使我坚持使用第一个POM片段的API规范,我仍然依赖于API的容器实现。如果升级后的服务器实现仍然没有bug,该怎么办?这些问题会成为在WAR中包含特定库版本并独立于容器运行的原因吗?但是我想我最好换成tomcat。谢谢。我的意思是,只有在war文件中将所有实现(例如,resteasy或jersey的某些版本)作为显式依赖项存在时,才切换到tomcat,这样就不需要使用应用服务器。我将在问题中作为注释来写
<dependency>
  <groupId>org.jboss.resteasy</groupId>
  <artifactId>resteasy-multipart-provider</artifactId>
  <version>3.6.3.Final</version>
  <scope>provided</scope>
</dependency>