Jakarta EE

Jakarta EEは、Javaで実装されたアプリケーションサーバの標準規格及びそのAPIを定めたもの。Java Platform, Standard Edition  の拡張機能の形で提供される。旧名はJava Platform, Enterprise Edition  。

1. 概要
-----

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

過去のリリースに伴い名称が変化しており、2017年現在のバージョンはJava Platform, Enterprise Edition 8  と命名されているが、Java EE 5より過去のバージョンはJava 2 Platform, Enterprise Edition  と命名されていた。

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

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

2. 歴史
-----

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

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, JavaMail 1.1, JavaBeans Activation Framework 1.0 Java 2 Platform, Enterprise Edition 1.3 JSR 58 として2001年9月24日にリリースされた。仕様検討は、Java Community Processの元で行われた。ベータ版が2001年4月にサンによってリリースされている。1.3では新たにJSPの標準カスタムタグライブラリであるJSTLや、JAXP, Java EE Connector Architecture, Java Authentication and Authorization Serviceといった技術が追加された。また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, Java EE Connector Architecture 1.7, JPA 2.1, Common Annotations 1.2, JMS 2.0, JTA 1.2, JavaMail 1.5, JAX-RS 2.0, Enterprise Web Services 1.3, Java API for XML Web Services 2.2, Web Services Metadata for Java, JAX-RPC 1.1, Java API for XML Messaging 1.3, Java API for XML Registries 1.0, JASPIC 1.1, Java ACC 1.5, Java EE Application Deployment 1.2, J2EE Management 1.1, Debugging Support for Other Languages 1.0, JAXB 2.2, JAXP 1.3, JDBC 4.0, JMX 2.0, JavaBeans Activation Framework 1.1, StAX Java Platform, Enterprise Edition
8 JSR 366として2017年9月21日にリリースされた。8ではServletがHTTP/2をサポートした4.0に更新されている。全体としては7の小改良に留まっているものの、JSF 2.3によるHTML処理が大きく改良されている。

3. 主なAPI
--------

Jakarta EE APIは Java SE APIを元に機能拡張された様々な技術を包含している。

[1]
[2]
[3]

3.1. package=javax.servlet.*
----------------------------

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

3.2. package=javax.websocket.*
------------------------------

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

3.3. package=javax.faces.*
--------------------------

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

3.4. package=javax.el.*
-----------------------

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

3.5. package=javax.enterprise.inject.*
--------------------------------------

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

3.6. package=javax.enterprise.context.*
---------------------------------------

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

3.7. package=javax.ejb.*
------------------------

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

3.8. package=javax.validation.*
-------------------------------

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

3.9. package=javax.persistence.*
--------------------------------

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

3.10. package=javax.transaction.*
---------------------------------

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

3.11. package=javax.security.auth.message.*
-------------------------------------------

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

3.12. package=javax.enterprise.concurrent.*
-------------------------------------------

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

3.13. package=javax.jms.*
-------------------------

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

3.14. package=javax.batch.api.*
-------------------------------

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

3.15. package=javax.resource.*
------------------------------

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

4. Jakarta EEの実装
----------------

Jakarta EEの機能を用いたアプリケーションを動作させるには、Jakarta EEの仕様を実装した実行環境やライブラリが必要である。Jakarta EE SDKには、Jakarta EEに準拠したオープンソースのアプリケーションサーバであるGlassFish Open Source Editionが同梱されている。GlassFish 5.0はJava EE 8の参照実装である。NetBeansやEclipseといったJava開発ツールの多くもJakarta EEに対応している。

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



5. 例
----

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

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

<WtXmlEndTag /><WtXmlEndTag />

<WtXmlEndTag /><WtXmlEndTag /><WtXmlEndTag />

5.1. バッキングBeanの例
----------------

JJakarta EEでは、ビューの処理の実装にバッキングBeanと呼ばれる仕組みを用いる。以下はCDIとEJBを用いたバッキングBeanの例である。

@Named @ViewScoped public class UserEdit {

private User user;

@Inject private UserDAO userDAO;

public String saveUser { userDAO.save; addFlashMessage + " saved");

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

public void setUser { this.user = user; }

public User getUser { return user; } }<WtXmlEndTag />

5.2. DAOの例
----------

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

@Stateless public class UserDAO {

@PersistenceContext private EntityManager entityManager;

public void save { entityManager.persist; }

public void update { entityManager.merge; }

public List getAll { return entityManager.createNamedQuery .getResultList; }

}<WtXmlEndTag />

5.3. エンティティの例
-------------

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

@Entity public class User {

@Id @GeneratedValue private Integer id;

@Size private String firstName;

@Size private String lastName;

public Integer getId { return id; }

public void setId { this.id = id; }

public String getFirstName { return firstName; }

public void setFirstName { this.firstName = firstName; }

public String getLastName { return lastName; }

public void setLastName { this.lastName = lastName; }

}<WtXmlEndTag />

6. 脚注
-----

7. 関連項目
-------

Java 、Java#エディション、Java#バージョン履歴
Java Platform, Standard Edition  - Java の汎用的なエディション
Java Platform, Micro Edition  - Java の組み込みシステム向けエディション
EAR - Jakarta EEアプリーケーションのパッケージ形式

8. 外部リンク
--------

[5]
[6]