Jakarta EE

Jakarta EEは、Eclipse Foundationが開発している、Javaで実装されたアプリケーションサーバの標準規格及びそのAPI。前身は Java Platform, Enterprise Edition (Java EE) だが、Java EE からパッケージ名が変わっているので上位互換というわけではない。

Java Platform, Enterprise Edition (Java EE) は Java 8 まで存在していたオラクルが開発していた Java のエディションの1つ。Java Platform, Standard Edition (Java SE) の拡張機能の形で提供されていた。

 概要 
 Java EE 

1999年に初版である1.2が発表された。主に小規模〜大規模サーバーシステムの標準仕様として、動的HTTPサーバ機能、自動トランザクション管理機能、データベース接続機能、メッセージング機能、各種通信プロトコル機能がAPIとして定められている。大規模システムにおける多層システムの構築も想定されており、XAプロトコルを用いた分散トランザクションにも対応している。

過去のリリースに伴い名称が変化しており、J2EE 1.4まではJava 2 Platform, Enterprise Edition (J2EE) と命名されていて、Java 5から8はJava Platform, Enterprise Edition (Java EE) と命名されていた。

Java EE自体は仕様であるため、各社・各組織がライセンスを受け実装している。オープンソースのものからプロプライエタリなもの、無償のものや有償のものなど選択肢が多い。

 Jakarta EE 
Java EEの権利はサン・マイクロシステムズを買収したオラクルが保有してきたが、同社は2017年にJava EEをEclipse Foundationに寄贈してオープンソース化をすることを発表。Java EEの商標については引き続きオラクルが保有するため、Java 9以後はJakarta EEの名で開発が進められている。

 歴史 
Java EEおよびJakarta EEは1999年の登場以後、数年おきに新しいバージョンが策定されている。

 Java EE 
 Java 2 Platform, Enterprise Edition 1.2
 最初のJ2EEの仕様。サン・マイクロシステムズが開発をし、1999年12月12日にリリースされた。1.2当初は以下のような技術から構成されていた。
 JDBC 2.0, JNDI 1.2, RMI-IIOP 1.0, Servlet 2.2, JSP 1.1, EJB 1.1, JMS 1.0, JTA 1.0,  1.1,  1.0

 Java 2 Platform, Enterprise Edition 1.3
 JSR 58 として2001年9月24日にリリースされた。仕様検討は、Java Community Processの元で行われた。ベータ版が2001年4月にサンによってリリースされている。1.3では新たにJSPの標準カスタムタグライブラリであるJSTLや、JAXP, , といった技術が追加された。またEJBが2.0へと更新され、JNDIはJ2SEへの移行により取り除かれた。

 Java 2 Platform, Enterprise Edition 1.4
 JSR 151として2003年11月24日にリリースされた。ベータ版は2002年12月にSunによってリリースされている。SOAPによるWebサービスを実現するJAXP, JAXR, JAX-RPCが導入された他は、小改良に留まっている。

 Java Platform, Enterprise Edition 5
 JSR 244として2006年5月11日にリリースされた。5からは名称・バージョン体系が改められており、またJ2SE 5.0で導入されたアノテーションを使った仕組みが導入されるなど、仕様自体も大きく変更された。中でもEJBはDIやPOJOの概念を取り入れ仕様を全面的に見直した3.0へと更新されており、さらにEJBから派生する形で永続化フレームワークであるJPAも追加されている。また、新たにWebアプリケーションフレームワークであるJSFが採用された。

 Java Platform, Enterprise Edition 6
 JSR 316として2009年12月10日にリリースされた。6では新たにDIを実現するCDIや、バリデーションを提供するBean Validationといった技術が追加されている。また、JSFが2.0となり大幅に仕様が変更となっている。

 Java Platform, Enterprise Edition 7
 JSR 342として2013年5月28日にリリースされた。7ではJSFが2.2となりCDIに準拠した上でHTML5にも対応した。WebSocketやバッチ処理に関する仕様が追加されている。Java EE 7は以下のような技術から構成されている。
 WebSocket, JSON Processing, Servlet 3.1, JSF 2.2, EL 3.0, JSP 2.3, JSTL 1.2, Batch Applications, Concurrency Utilities, CDI 1.1, DI 1.0, Bean Validation 1.1, EJB 3.2, Interceptors 1.2,  1.7, JPA 2.1,  1.2, JMS 2.0, JTA 1.2,  1.5, JAX-RS 2.0, Enterprise Web Services 1.3,  2.2, , JAX-RPC 1.1,  1.3,  1.0, JASPIC 1.1, Java ACC 1.5, Java EE Application Deployment 1.2,  1.1, Debugging Support for Other Languages 1.0, JAXB 2.2, JAXP 1.3, JDBC 4.0, JMX 2.0,  1.1, StAX

 Java Platform, Enterprise Edition 8
 JSR 366として2017年9月21日にリリースされた。8ではServletがHTTP/2をサポートした4.0に更新されている。全体としては7の小改良に留まっているものの、JSF 2.3によるHTML処理が大きく改良されている。

 Jakarta EE 
Jakarta EE は単なる Java SE のライブラリであり、Java EE 時代は Java SE とバージョンの付け方を揃えていたが、Jakarta EE のバージョンの付け方は Java SE のバージョンの付け方とは無関係である。
 Jakarta EE Platform 8
 2019年9月10日リリース。基本的に Java EE 8 と同一。仕様名から Java を消し Jakarta を付ける作業が行われた。
 Jakarta EE Platform 9
 2020年12月8日リリース。名前空間が javax から jakarta に変わった。これ以降は Java EE の上位互換ではない。
 Jakarta EE Platform 9.1
 2021年5月25日リリース。
 Jakarta EE Platform 10
 2022年9月22日リリース。Java SE 11以降が必要。
 Jakarta EE Platform 11
 2025年6月リリース。Java SE 17以降が必要。

 構成 
Jakarta EE 11 現在、Jakarta EE Platform は以下の仕様で構成される。
 Jakarta EE Web Profile に含まれる物
 Jakarta EE Core Profile に含まれる物
 Jakarta RESTful Web Services
 Jakarta JSON Processing
 Jakarta JSON Binding
 Jakarta Annotations
 Jakarta Interceptors
 Jakarta Dependency Injection
 Jakarta Contexts and Dependency Injection Lite
 Jakarta EE Core Profile に含まれない物
 Jakarta Authentication
 Jakarta Data
 Jakarta Concurrency
 Jakarta Persistence
 Jakarta Contexts and Dependency Injection
 Jakarta Pages
 Jakarta Expression Language
 Jakarta WebSocket
 Jakarta Faces
 Jakarta Validation
 Jakarta Security
 Jakarta Debugging Support
 Jakarta Servlet
 Jakarta Standard Tag Libraries
 Jakarta Enterprise Beans Lite
 Jakarta Transactions
 Jakarta EE Web Profile に含まれない物
 Jakarta Authorization
 Jakarta Activation
 Jakarta Batch
 Jakarta Connectors
 Jakarta Mail
 Jakarta Messaging
 Jakarta Enterprise Beans

 主なAPI 
 Java EE 
Java EE APIは Java SE APIを元に機能拡張された様々な技術を包含している。以下の記述は Java EE 8 のものであり、Jakarta EE 9 以降は異なる。

 Java EE 6 API Specification
 Java EE 7 Specification APIs
 Java EE 8 Specification APIs


Servletパッケージでは、主にHTTPリクエストのためのAPIが定義されている。またJavaServer Pages (JSP) に関するAPIも含まれる。


WebSocketパッケージでは、WebSocketの通信に関するAPIが定義されている。


Facesパッケージでは、 Java Server Faces (JSF) に関するAPIが定義されている。JSFはコンポーネントによるUI構築技術である。


ELパッケージでは、Java EEのEL式に関するクラスとインターフェースが定義されている。EL式はJSPやJSFを作成するWebアプリケーション開発者のためにデザインされた簡単な構文である。主にJSFにおいてコンポーネントに管理beanを結びつけるために用いられるが、仕様自体は独立しており、それ以外の部分でも使用可能である。


Injectパッケージでは、Contexts and Dependency Injection (CDI) APIのためのインジェクションアノテーションが定義されている。CDIは依存性の注入 (DI) に関する仕様である。


Contextパッケージでは、Contexts and Dependency Injection (CDI) APIのためのコンテキストアノテーションとインタフェースが定義されている。


Enterprise JavaBeans (EJB) パッケージでは、EJBコンテナがサポートするトランザクション処理 (JTA)、RPC（RMIまたはRMI-IIOP）、並行性制御、依存性の注入 (DI)、ビジネスオブジェクトのためのアクセス制御といった軽量APIが定義されている。またこのパッケージは、エンタープライズBeanとそのクライアント間、エンタープライズBeanとEJBコンテナ間の取り決めを定義したクラスとインタフェースも含む。


Validationパッケージでは、Bean Validation APIのためのアノテーションとインタフェースが定義されている。Bean Validationはbean（例えばJPAのモデルクラス）に対する統一されたバリデーション（値の検証）手法を提供する。Java EEの各要素では、JPAが永続化層におけるバリデーションに、JSFがビュー層におけるバリデーションにまた関与する。


Persistenceパッケージには、永続化プロバイダと管理クラス、それにJava Persistence API (JPA) クライアントの間の取り決めを定義したクラスとインタフェースが含まれている。


Transactionパッケージでは、Java EEのトランザクション処理を担うJava Transaction API (JTA) のインタフェースとアノテーションを含むAPIが定義されている。これらのAPIは低レベルAPIが抽象化されたものであり、通常のアプリケーション開発者がJava EEを用いて開発する場合は、EJBのより高レベルのトランザクション管理を用いたり、このAPIのアノテーションとCDIの管理Beanとを組み合わせて使用することが想定されている。


Messageパッケージでは、Java Authentication SPI (JASPIC) のインタフェースやクラスを含むAPIが定義されている。JASPICはセキュアなJava EEアプリケーションを構築するための仕様である。


Concurrentパッケージでは、Java EEプラットフォーム標準の管理されたスレッドプールと連携する、並行処理に関するインタフェースが定義されている。


JMSパッケージでは、Java Message Service (JMS) APIが定義されている。JMSはJavaプログラムにエンタープライズメッセージの生成、送信、受信、読込のための手法を提供する。


BatchのAPIパッケージでは、Java EEのバッチ処理のためのAPIが定義されている。バッチ処理APIは、大容量のデータを扱う長時間に亘るバックグラウンドタスクや、定期的に実行されるタスクのための手法を提供する。


Resourceパッケージでは、 (JCA) APIが定義されている。JCAはEnterprise application integration (EAI) の一部であるアプリケーションサーバーや企業情報システム (EIS) の相互接続を実現するための技術である。このAPIはベンダーのための低レベルAPIであり、通常のアプリケーション開発者をターゲットとしてはいない。

 アプリケーションサーバー 
Jakarta EEの機能を用いたアプリケーションを動作させるには、Jakarta EEの仕様を実装した実行環境やライブラリが必要である。NetBeansやEclipseといったJava開発ツールの多くもJakarta EEに対応している。

 Java EE 
Java EE 8 SDKには、Java EE 8に準拠したオープンソースのアプリケーションサーバであるGlassFish Open Source Editionが同梱されていた。GlassFish 5.0はJava EE 8の参照実装だった。

以下に、Java EE に準拠した主なアプリケーションサーバを示す。表のバージョン番号は、該当するJava EE仕様に対応したバージョンを表している。

アプリケーションサーバJava EE 8準拠Java EE 7準拠Java EE 6準拠 (Full Profile)Java EE 6準拠 (Web Profile)Java EE 5準拠J2EE 1.4準拠ライセンス GlassFish server Open Source Edition  v5.x  v4.x http://www.oracle.com/technetwork/java/javaee/community/testedconfiguration-glassfish4-0-1957654.html  v3.x https://glassfish.dev.java.net/public/comparing_v2_and_v3.html  v3.x Web Profile  v2.1.x Payara Server  v5.x  4.x  Oracle GlassFish Server  v3  Sun Java System Application Server v9.0  Sun Java System Application Server v8.2 （OSS版を元とする）   v12.2.x  v12.1.xhttp://wcc.on24.com/event/37/57/27/rt/1/documents/player_docanchr_3/weblogic12c_launch_tech_webinar_v8.pdf  v10.3.5.0  v9  WildFly v14.xhttp://wildfly.org/news/2018/08/30/WildFly14-Final-Released/  v12,x, v11.x, v10.x, v9.x, v8.xwildfly.org/about/#complianthttps://issues.jboss.org/browse/WFLY-469http://lists.jboss.org/pipermail/wildfly-dev/2013-May/000062.html, v7.1  v6.0 , v7.0   v5.1Java EE CompatibilityJBoss AS is now EE5 certified  v4.x  JBoss Enterprise Application Platform  v7.2   v7.0  v6.0   v5 （WildFlyの商用版） IBM WebSphere Application Server  v8  v7   Open Liberty  v18.0.0.2  v18.x, v17.x, IBM WAS Liberty v8.5.5.6 http://oracle.com/technetwork/java/javaee/overview/waslibertyprofile8556-2587134.htmlhttps://developer.ibm.com/wasdev/blog/2015/06/25/java-ee-7-has-landed-in-was-liberty  IBM WAS Liberty v8.5.5 http://www.oracle.com/technetwork/java/javaee/community/ibm-javaee6-web-tested-configs-1961333.html    IBM WebSphere Application Server Community Edition  v3.0  v2.1  Apache Geronimo  v3.0   v2.0  v1.0  TmaxSoft JEUS  v8 http://www.oracle.com/technetwork/java/javaee/community/tmax-jeus-8-tested-configuration-1995477.htmlhttp://tmaxsoft.com/product/jeus/certificationhttps://blogs.oracle.com/theaquarium/entry/tmaxsoft_jeus_8_now_java  v7  v6  v5  富士通 Interstage Application ServerFujitsu Interstage Application Server powered by Windows Azure  v1   NEC WebOTX  v10https://www.oracle.com/java/technologies/necjavaee7.html  v9http://www.oracle.com/technetwork/java/javaee/community/nec-webotx-v9x-certification-2002719.html  v8      v4.0.http://www.caucho.com/articles/Caucho_Web%20Profile%20JavaEE6_whitepaper_byRR.pdf       OW2 JOnAS   v5.3 rc1 http://jonas.ow2.org/xwiki/bin/view/Blog/JOnAS+530+RC1+released    SAP NetWeaver  v2.x https://blogs.oracle.com/theaquarium/entry/sap_netweaver_cloud_java_ee       Oracle iPlanet Web Server  Sun Java System Web Server     Sybase Enterprise Application Server EAServer  

 Jakarta EE 
Jakarta EE に対応しているアプリケーションサーバーの一覧。

 日本
 FUJITSU Software Enterprise Application Platform, FUJITSU Software Interstage Application Server
 WebOTX Application Server
 米国
 Apache TomEE
 Eclipse GlassFish, ManageFish Server
 IBM WebSphere Liberty, Open Liberty
 JBoss Enterprise Application Platform, WildFly
 Oracle WebLogic Server, Helidon
 イギリス
 Payara Server Community, Payara Server Enterprise
 韓国
 JEUS
 中国
 AISWare Flying Server
 AliEE
 Apusic AAS
 BES Application Server
 InforSuite Application Server
 Primeton AppServer
 RockyAS
 Thunisoft Application Server
 TongWeb Application Server
 xigema Application Server

 Java EE 7の例 
以下に、Java EE 7の様々な技術を組み合わせて作成した、ユーザーの登録を行うWeb入力画面のサンプルを示す。

Java EE 7には、サーブレットにJSP、またJSFとFaceletsといった、Web UIを作ることが可能ないくつかの技術が存在する。以下はJSFとFaceletsを用いた例である。コード上では明示されていないが、入力コンポーネントでは入力値の検証にBean Validationを使用している。

<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://xmlns.jcp.org/jsf/html" xmlns:f="http://xmlns.jcp.org/jsf/core">

    <f:metadata>
        <f:viewParam name="user_id" value="#{userEdit.user}" converter="#{userConvertor}" />
    </f:metadata>

    <h:body>

        <h:messages />

        <h:form>
            <h:panelGrid columns="2">
                <h:outputLabel for="firstName" value="First name" />
                <h:inputText id="firstName" value="#{userEdit.user.firstName}" label="First name" />

                <h:outputLabel for="lastName" value="Last name" />
                <h:inputText id="lastName" value="#{userEdit.user.lastName}" label="Last name" />

                <h:commandButton action="#{userEdit.saveUser}" value="Save" />
            </h:panelGrid>
        </h:form>

    </h:body>
</html>

 バッキングBeanの例 
Jakarta EEでは、ビューの処理の実装にバッキングBean（画面の背後で処理するBean、管理Beanとも）と呼ばれる仕組みを用いる。以下はCDIとEJBを用いたバッキングBeanの例である。

@Named
@ViewScoped
public class UserEdit {

    private User user;

    @Inject
    private UserDAO userDAO;

    public String saveUser() {
        userDAO.save(this.user); 
        addFlashMessage("User " + this.user.getId() + " saved");

        return "users.xhtml?faces-redirect=true";
    }

    public void setUser(User user) {
        this.user = user;
    }

    public User getUser() {
        return user;
    }
}

 DAOの例 
Jakarta EEでは、ビジネスロジックの実装のためにEJBが用意されている。データの永続化ではJDBCやJPAが使用できる。以下はEJBとJPAを用いたData Access Object (DAO) の例である。コード上では明示されていないが、EJBではトランザクション管理にJTAが使用される。

@Stateless
public class UserDAO {

    @PersistenceContext
    private EntityManager entityManager;

    public void save(User user) {
        entityManager.persist(user);
    }

    public void update(User user) {
        entityManager.merge(user);
    }

    public List<User> getAll() {
        return entityManager.createNamedQuery("User.getAll", User.class)
                            .getResultList();
    }

}

 エンティティの例 
Jakarta EEでは、エンティティ/モデルクラスのためにJPAが用意されており、またバリデーション（値の検証）ではBean Validationが使用できる。以下は両者を用いた例である。

@Entity
public class User {

    @Id
    @GeneratedValue(strategy = IDENTITY)
    private Integer id;

    @Size(min = 2, message="First name too short")
    private String firstName;

    @Size(min = 2, message="Last name too short")
    private String lastName;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

}

 脚注 

 関連項目 

 Java 、Java#エディション（Java SE、Java EE、Java MEなど）、Java#バージョン履歴（JDK 1.0からJ2SE 1.2、Java SE 8、Java SE 9など）
 Java Platform, Standard Edition (Java SE) - Java の汎用的なエディション
 Java Platform, Micro Edition (Java ME) - Java の組み込みシステム向けエディション
 EAR - Jakarta EEアプリーケーションのパッケージ形式

 外部リンク 
 Jakarta EE
 Oracle - Java EE

Category:Java
Category:ウェブアプリケーション
Category:Javaプラットフォーム
Category:Java enterprise platform
Category:Java specification requests
Category:Eclipse Foundation