2025年8月7日に実施した「Java EE→Jakarta EE移行セミナー」で,
- Libertyならば,今後も当分の間Java EEが利用できるので,すぐに移行する必要がない
- Java EEアプリケーションと,移行済みのJakarata EEアプリケーションの両方が実行できるので,段階的な移行が可能
というような内容をお話ししました。その後,多くの問い合わせをいただいています。
この記事では,セッションの内容を元に,Java EEからJakarta EEとは何か,どういう移行方法があるのか,Libertyの特長とは,といった内容を紹介します。
Java EEからJakarta EEへ
エンタープライズJavaの標準仕様は,20世紀末にJ2EEとして登場して以来,ビジネスアプリケーション開発の根幹を支えながら,時代の要請に応じてその姿を変えてきました。2006年にJava EEと改名された標準仕様は,Sun Microsystems,そして後にSunを買収したOracleが中心となり,JCP (Java Community Process)という枠組みの中で,ベンダー主導で仕様策定が進められました 。
2017年,OracleはJava EEをEclipse Foundationへ移管することを発表しました。よりオープンで迅速な意思決定が可能なコミュニティ主導の開発モデルへ移行するためです。これにより,プラットフォームはJakarta EEという新しい名称で再出発することになりました。
- Java EE (ベンダー主導)
- 2009年 Java EE 6: Lightweight
- 2013年 Java EE 7: Productivity & HTML5
- 2017年 Java EE 8: Modernization & Simplification
- Jakarta EE(コミュニティ主導)
- 2019年 Jakarta EE 8.0: 新しいコミュニティプロセスの確立
- 2020年 Jakarta EE 9.0: 名前空間を
javax
からjakarta
へ変更 - 2021年 Jakarta EE 9.1: Java SE 11仕様への対応
- 2022年 Jakarta EE 10: Core Profile
- 2025年 Jakarta EE 11: Data APIの新設など
名前空間の変更
Jakarta EEでは,Jakarta EE 9で最も大きな変革が行われました。Oracleが保有する javax
という商標の問題を解決するため,APIのパッケージ名前空間がjavax.*
からjakarta.*
へと一斉に変更されたのです。
Java EEのアプリケーションでは,Javaのソースで,利用するAPIのクラスをimport
して利用します。このクラスはjavax
で始まるパッケージ名(名前空間)で定義されていました。
// Java EE 8以前のコード (javax名前空間)
import javax.annotation.Resource;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.sql.DataSource;
Jakarta EEで提供されるAPIは,jakarta
で始まるパッケージ名(名前空間)で定義されるように変更されました。そのため,Java EEのアプリケーションを移行するためには,Javaのソースを書き換えて再コンパイルする必要があります。
// Jakarta EE 9以降のコード (jakarta名前空間)
import jakarta.annotation.Resource;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import javax.sql.DataSource; // Java SEのAPIは変更せずそのまま
ソースコードの変換については,Eclipse TransformerやOpenRewriteなど多くのツールが提供されており,機械的に変換することが可能です。
一方で変更に伴い,アプリケーションが利用している外部ライブラリやフレームワークも,Jakarta EEの名前空間に対応したバージョンへのアップグレードが必須となります。このライブラリの更新は,しばしば大きな変更負荷となり,時として移行自体が不可能になってしまうケースがありえます。
主要フレームワークの対応状況
Java EE/Jakarta EE仕様に依存する周辺ソフトウェアについても,バージョンごとに対応する名前空間が存在します。
実行環境のバージョンアップでJakarta EEへの移行が必要となるとき,これら仕様やフレームワークについても,jakarta
名前空間に対応したバージョンに上げることが必要になります。
また逆に,これらのバージョンを上げるために,jakarta
名前空間に対応した実行環境にバージョンアップしなければいけないこともあります。
MicroProfile仕様
- 2021年8月 MicroProfile 4.1以前は
javax
名前空間 - 2022年1月 MicroProfile 5.0移行は
jakarta
名前空間
Spring Framework
- 2020年10月 Spring Framework 5.3以前は
javax
名前空間 - 2022年11月 Spring Framework 6.0移行は
jakarta
名前空間
Spring Boot
- 2022年5月 Spring Boot 2.7以前は
javax
名前空間 - 2022年11月 Spring Boot 3.0移行は
jakarta
名前空間
Struts
- 2000年 Struts 1.xは
javax
名前空間(2013年にサポート終了) - 2007年 Struts 2.xは
javax
名前空間(2024年にサポート終了) - 2022年 Struts 6.xは
javax
名前空間 - 2024年 Struts 7.xは
jakarta
名前空間
実行環境の対応状況
Apache Tomcat
- 2014年 Tomcat 8(Servlet 3.1対応)は
javax
名前空間 - 2017年 Tomcat 9(Servlet 4.0対応)は
javax
名前空間 - 2020年 Tomcat 10.0(Servlet 5.0対応)は
jakarta
名前空間 - 2022年 Tomcat 10.1(Servlet 6.0対応)は
jakarta
名前空間 - 2024年 Tomcat 11(Servlet 6.1対応)は
jakarta
名前空間
Tomcat 10以降にバージョンを上げる際に,Jakarta EEへの移行が必要となります。
GlassFish
- 2013年 GlassFish 4.x(Java EE 7対応)は
javax
名前空間 - 2017年 GlassFish 5.0(Java EE 8対応)は
javax
名前空間 - 2019年 Eclipse GlassFish 5.1(Jakarta EE 8対応)は
javax
名前空間 - 2020年 Eclipse GlassFish 6.0(Jakarta EE 9対応)は
jakarta
名前空間 - 2021年 Eclipse GlassFish 6.1(Jakarta EE 9.1対応)は
jakarta
名前空間 - 2022年 Eclipse GlassFish 7.x(Jakarta EE 10対応)は
jakarta
名前空間
GlassFish 6.x移行(をベースとした製品)にバージョンを上げる際に,Jakarta EEへの移行が必要となります。
JBoss EAP
- 2016年 JBoss EAP 7.0(Java EE 7対応)は
javax
名前空間 - 2019年 JBoss EAP 7.2(Java EE 8対応)は
javax
名前空間 - 2024年 JBoss EAP 8(Jakarta EE 10対応)は
jakarta
名前空間
JBoss EAP 8にバージョンを上げる際に,Jakarta EEへの移行が必要となります。
WebSphere Application Server(tWAS/WebSphere traditional)
- 2010年 WAS V8.0(Java EE 6対応)は
javax
名前空間 - 2014年 WAS V8.5(Java EE 6対応)は
javax
名前空間 - 2016年 WAS V9.0(Java EE 7対応)は
javax
名前空間
従来型のWASは,Jakarta EE 11以降に対応していません。jakarta
名前空間のアプリケーションを実行することが出来ません。
WebSphere Application Server Liberty / Open Liberty
- 2015年 Liberty v8.5.5.6(Java EE 7)は
javax
名前空間 - 2018年 Liberty v18.0.0.2 (Java EE 8)は
javax
名前空間 - 2021年 Liberty v21.0.0.12(Jakarta EE 9.1)は
javax
/jakarta
名前空間 - 2023年 Liberty v23.0.0.3(Jakarta EE 10)は
javax
/jakarta
名前空間
Libertyは,Jakarta EEをサポートし,jakarta
名前空間に対応した後も,Java EEのAPIを提供し続けています。Libertyは,当分の間javax
名前空間のアプリケーションも継続して利用できます。Libertyであれば,既存のアプリケーションのJakarta EE対応は必須ではありません。
Libertyのゼロマイグレーション・ポリシー
Liberty Feature
Libertyは完全にモジュール化されており,アプリから利用するAPIやサーバーで提供される機能が,個別のFeatureというモジュールで実装されています。
Libertyの構成ファイルserver.xml
では,使用したい機能を提供する<feature>
を設定します。
<featureManager>
<feature>jsp-2.3</feature>
<feature>jdbc-4.1</feature>
<feature>jaxrs-2.0</feature>
<feature>sessionDatabase-1.0</feature>
<feature>ssl-1.0</feature>
</featureManager>
すると記述したFeatureと,それが依存するFeature。必要な機能だけがロードされて初期化されます。これにより最小限のメモリ使用量,短い起動時間を実現できるようになっています。
[監査 ] CWWKF0012I: サーバーは次のフィーチャーをインストールしました。[appSecurity-2.0,
distributedMap-1.0, el-3.0, jaxrs-2.0, jaxrsClient-2.0, jdbc-4.1, jndi-1.0,
json-1.0, jsp-2.3, servlet-3.1, sessionDatabase-1.0, ssl-1.0]。
ゼロマイグレーション
Libertyでは,新しいバージョンが出て新しいAPI仕様に対応したときには,従来提供していたFatureを置き換えるのではなく,古い仕様のFeatureも提供したまま追加で新しい仕様のFeatureを提供します。
Libertyでは,提供されているFeatureは原則として削除されません。Servlet 4.0仕様や5.0仕様が提供されている現在でも,Servlet 3.1の仕様のFeatureの提供は続いています。
つまり,Jakarta EEに対応した最新版のLibertyであっても,Java EE仕様のFeatureは提供され続けています。構成ファイルに,Java EEのFeatureを記述すればjavax
の名前空間のアプリケーションが稼働しますし,
<featureManager>
<feature>servlet-4.0</feature>
<feature>jsp-2.3</feature>
<feature>jaxrs-2.1</feature>
<feature>cdi-2.0</feature>
</featureManager>
Jakarta EEのFeatureを記述すればjakarta
の名前空間のアプリケーションが稼働します。
<featureManager>
<feature>servlet-6.0</feature>
<feature>pages-3.1</feature>
<feature>restfulWS-3.1</feature>
<feature>cdi-4.0</feature>
</featureManager>
ただ,一つの構成ファイルで稼働する一つのLibertyプロセス内で同居することは出来ません。<featureManager>
には,同じJava EE/Jakarta EEのバージョンに属するFeatureしか記述できません。構成ファイルを分け,異なるLibertyプロセスであれば,それぞれで新旧のアプリケーションが利用できます。
いつまで使えるのか?
Java EEのFeatureは,削除の予定はありません。Libertyの対応するJava SEのバージョンが上がり,Java EEの機能を提供する互換性が失われたら,その時点で削除が検討されます。ですが,2025年にでたJava 25でもJava EEの機能は問題なく稼働しています。
Jakarta EEへ移行できないアプリケーションの実行ならLiberty
- 利用しているライブラリにJakarta EE対応版が存在しない
- フレームワークを提供しているベンダーと取引がなくなってしまった
- ライブラリをバージョンアップすると,APIの変更が大きく対応が困難
等々の理由で,Jakarta EEへの移行が非常に難しいアプリケーションがしばしばあります。移行のためには,別のアーキテクチャーで最初から作り直す必要がある場合などです。
しかし多くの実行環境では,バージョンが上がるとJava EEのアプリケーションを実行することが出来なくなります。
このような状況において,Open Liberty / WebSphere Libertyが有効な選択肢となります 。
Open Liberty
Open Libertyは,IBMが開発するJava EE / Jakarta EE / MicroProfileなどの標準仕様に準拠した,アプリケーション実行環境です。ビジネスに使用しやすいEPL(Eclipse Public License)で公開されているOSSで,誰でも無償で利用することが出来ます。
公式サイトにあるクイック・スターターを使えば,わずか数ステップで動作環境を簡単に構築できます 。
WebSphere Liberty
Open Libertyをベースに,IBMの公式サポートが付与された製品版です。有償のライセンスを契約すると使用でき,IBMからの障害対応などのサポートが提供されます。
Libertyの大きな特徴は,製品版のWebSphere LibertyとOSS版のOpen Libertyのバージョンが完全に同期されているということです。この両者は,同じバージョン番号が,同じスケジュールで公開されます。新機能も,同時に提供されます。Open Liberty上で検証した構成やアプリケーションについては,同じバージョンのWebSphere Libertyで全く同じように動作します。