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

## 概要

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

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

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

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

## 歴史

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

## 主なAPI

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

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

### javax.servlet.*

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

### javax.websocket.*

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

### javax.faces.*

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

### javax.el.*

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

### javax.enterprise.inject.*

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

### javax.enterprise.context.*

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

### javax.ejb.*

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

### javax.validation.*

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

### javax.persistence.*

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

### javax.transaction.*

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

### javax.security.auth.message.*

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

### javax.enterprise.concurrent.*

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

### javax.jms.*

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

### javax.batch.api.*

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

### javax.resource.*

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

## 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 (Java EE) に準拠した主なアプリケーションサーバを示す。表のバージョン番号は、該当するJakarta 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 | Yes v5.x | Yes v4.x | Yes v3.x | Yes v3.x Web Profile | Yes v2.1.x |  | CDDL, GPL |
| Payara Server | Yes v5.x | Yes 4.x |  |  |  |  | CDDL, GPL |
| Oracle GlassFish Server |  |  | Yes v3 |  | Yes Sun Java System Application Server v9.0 | Yes Sun Java System Application Server v8.2 | プロプライエタリ (OSS版を元とする) |
| Oracle WebLogic Server |  | Yes v12.2.x | Yes v12.1.x |  | Yes v10.3.5.0 | Yes v9 | プロプライエタリ |
| WildFly | Yes v14.x | Yes v12,x, v11.x, v10.x, v9.x, v8.x, v7.1 | Yes v6.0 , v7.0 |  | Yes v5.1 | Yes v4.x | LGPL |
| JBoss Enterprise Application Platform | Yes v7.2 | Yes v7.0 | Yes v6.0 |  | Yes v5 |  | LGPL (WildFlyの商用版) |
| IBM WebSphere Application Server |  |  | Yes v8 |  | Yes v7 | Yes | プロプライエタリ |
| Open Liberty | Yes v18.0.0.2 | Yes v18.x, v17.x, IBM WAS Liberty v8.5.5.6 | Yes IBM WAS Liberty v8.5.5 |  |  |  | Eclipse Public License |
| IBM WebSphere Application Server Community Edition |  |  | Yes v3.0 |  | Yes v2.1 |  | プロプライエタリ |
| Apache Geronimo |  |  | Yes v3.0 |  | Yes v2.0 | Yes v1.0 | Apache License 2.0 |
| TmaxSoft JEUS |  | Yes v8 | Yes v7 |  | Yes v6 | Yes v5 | プロプライエタリ |
| 富士通 Interstage Application Server |  |  | Yes v1 |  | Yes |  | プロプライエタリ |
| NEC WebOTX |  | Yes v10 | Yes v9 |  | Yes v8 |  | プロプライエタリ |
| Caucho Resin Server |  |  |  | Yes v4.0. |  | Yes | プロプライエタリ |
| Apache TomEE |  |  |  | Yes |  |  | Apache License 2.0 |
| OW2 JOnAS |  |  |  | Yes v5.3 rc1 | Yes | Yes | LGPL |
| SAP NetWeaver |  |  |  | Yes v2.x | Yes | Yes | プロプライエタリ |
| Oracle Containers for Java EE |  |  |  |  | Yes |  | プロプライエタリ |
| Oracle iPlanet Web Server |  |  |  |  |  | Yes Sun Java System Web Server | プロプライエタリ |
| Oracle Application Server 10g |  |  |  |  |  | Yes | プロプライエタリ |
| Sybase Enterprise Application Server |  |  |  |  |  | Yes | プロプライエタリ |

## 例

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

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

### バッキングBeanの例

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

### DAOの例

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

### エンティティの例

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