Java EE 7はどこが変わった? そしてJava EE 8はどう変わる?──Java EEエバンジェリストのレザ・ラーマンが語る

Oracle Java & Developers編集部
2014-07-04 19:15:00
  • このエントリーをはてなブックマークに追加

アプリケーション・サーバ・ベンダー各社が対応を急ぐJava EE 7の主な変更点は何か、またJava EE 8はどのような方向性で仕様策定が進められているのか。Java EEエバンジェリストのレザ・ラーマン氏が解説する。

 ご存じのとおり、Java EEの最新バージョンは2013年7月にリリースされた「Java EE 7」である。現在、アプリケーション・サーバ・ベンダー各社は、同バージョンに対応すべく製品開発を進めている。また、次期バージョンのJava EE 8は、アプリケーション・サーバ・ベンダー各社も加わり、2016年第3四半期のリリースを目指して仕様策定が進められている。それでは、Java EE 7ではどのような機能が追加され、またJava EE 8ではいかなる機能強化が図られようとしているのか。米国オラクルのJava EEプラットフォーム・グループでJava EEエバンジェリストを務めるレザ・ラーマン氏による解説をお届けする。

※ 本記事は、2014年5月に東京で開催された「Java Day Tokyo 2014」におけるレザ・ラーマン氏のセッション「JavaEE.Next(): Java EE 7, 8, and Beyond」を基に作成しています。Java EE 8に関する内容はセッション実施時点での予定事項であり、すべてが確定した事項ではない点、ご了承ください。

Java EEの変遷。Java EE 7はプログラミング・モデルの改良にフォーカス

米国オラクル Java EEプラットフォーム・グループ Java EEエバンジェリストのレザ・ラーマン氏
米国オラクル Java EEプラットフォーム・グループ Java EEエバンジェリストのレザ・ラーマン氏

 Java EE 7の解説に先立ち、まずJava EEの変遷について簡単におさらいしておきましょう。

 Java EEは、2003年11月にリリースされたJ2EE 1.4から2006年5月にリリースされたJava EE 5へのバージョンアップで大きな飛躍を遂げました。よく指摘されるように、J2EE 1.4は十分に成熟しておらず、さまざまな問題を抱えていました。しかし、Java EE 5では、開発の簡易化(Ease of Development)や、EJBの改良、JSF(JavaServer Faces)やWebサービス用APIの追加といった機能拡張により、問題が根本的に改善されたのです。

 続いて2009年12月にリリースされたJava EE 6は、Java EE 5の変更点を"地固め"したバージョンだと言えます。CDI(Contexts and Dependency Injection)としてDI(依存性の注入)の仕組みが取り込まれ、軽量なWebサービス技術としてJAX-RSが追加されました。

 その後にリリースされたJava EE 7では、主にプログラミング・モデルの改良にフォーカスしています。例えば、HTML5やWebSocketへの対応、JAX-RSの機能拡張などです。

Java EE 7は、これまでで最も大きな変更が行われたバージョン

 以上のような変遷を経た誕生したJava EE 7には、どのような価値があるのでしょうか。Java EE 7では、Javaバッチ(jBatch。JSR 352)、Java API for JSON Processing(JSR 353)、Java API for WebSocket(JSR 356)といったAPIが追加されています。また、JMS(Java Message Service) 2.0、JAX-RS、EL(Expression Language) 3.0が導入されました。Java EE 7は、これまでで最も大きな変更が行われたバージョンだと言えるでしょう。

 以降、Java EE 7の主な変更点を見ていきましょう。

JMS 2.0

 JMS 2.0では、プログラミング・モデルの見直しが行われ、これまでの反省点を生かしてAPIの設計が改良されています。以前のバージョンとJMS 2.0のAPIを見比べれば、いかにシンプルになったかがおわかりいただけるでしょう。JMSを使うための従来のプログラム・コードは決して見やすいとは言えず、かなりの量のコードを記述して、ようやく機能的なコアである「MessageProducer.send (textMessage);」にたどり着くといった具合でした。

【JMSの旧バージョンを使ったプログラムの例】

@Resource(lookup = "java:global/jms/demoConnectionFactory") ConnectionFactory connectionFactory; @Resource(lookup = "java:global/jms/demoQueue") Queue demoQueue; public void sendMessage(String payload) { try { Connection connection = connectionFactory.createConnection(); try { Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); MessageProducer messageProducer = session.createProducer(demoQueue); TextMessage textMessage = session.createTextMessage(payload); messageProducer.send(textMessage); } finally { connection.close(); } } catch (JMSException ex) { Logger.getLogger(getClass().getName()).log(Level.SEVERE, null, ex); } }

 これに対して、JMS 2.0ではAPIが非常にシンプルに整理されており、次の例のように機能的なコアにすぐにたどり着くことができます。

【JMS 2.0を使ったプログラムの例】

@Inject private JMSContext context; @Resource(mappedName = "jms/inboundQueue") private Queue inboundQueue; public void sendMessage (String payload) { context.createProducer().send(inboundQueue, payload); }

Java API for WebSocket(JSR 356)

 Java API for WebSocketは、WebSocketへのアクセスを容易にするという点で有益な仕組みです。このプログラミング・モデルの変更はJava EE 8でも引き続き行うので、ぜひ今後も注目してください。具体的には、WebSocketに対するアクセスや開発を、さらに容易にしていきます。

 Java EE 7では、WebSocketを簡単に利用することができます。具体的には、サーバ側プログラムに@ServerEndpointというアノテーションを書けばWebSocketによる通信が可能となり、@OnOpen、@OnCloseといったアノテーションでセッションのオープン/クローズを行うといった具合です。

【Java API for WebSocketを使ったプログラムの例】

@ServerEndpoint("/chat") public class ChatServer { Set peers = ... @OnOpen public void onOpen(Session peer) { peers.add(peer); } @OnClose public void onClose(Session peer) { peers.remove(peer); } ...

Java API for JSON(JSR 353)

 Java API for JSON Processingは、業界標準に準拠したJSONプロセッシング用のAPIです。このAPIを使うことで、JSONの処理をプラットフォームに組み込むことが可能となります。

 Java API for JSON ProcessingではJAXB(Java Architecture for XML Binding)を使っており、POJO(Plain Old Java Objects)を使用するこができます。Object Model API(パッケージjavax.json)とStreaming API(パッケージjavax.json.stream)を中心とするシンプルなAPIであり、JSONデータのパーシングも可能となっています。

【JSONデータの書き込み処理の例
(Object Model APIを使用)】

JsonArray value = Json.createArrayBuilder() .add(Json.createObjectBuilder() .add("type", "home") .add("number", "212 555-1234") ) .add(Json.createObjectBuilder() .add("type", "fax") .add("number", "646 555-4567") ) .build();

【JSONデータ】

[ { "type": "home”, "number": "212 555-1234" }, { "type": "fax”, "number": "646 555-4567" } ]

【JSONデータの読み込み処理の例(Streaming APIを使用)】

{ "firstName": "John", "lastName": "Smith", "age": 25, "phoneNumber": [ { "type": "home", "number": "212 555-1234" }, { "type": "fax", "number": "646 555-4567" } ] } …略… Event event = parser.next(); // START_OBJECT event = parser.next(); // KEY_NAME event = parser.next(); // VALUE_STRING String name = parser.getString(); // "John”
このサイトでは、利用状況の把握や広告配信などのために、Cookieなどを使用してアクセスデータを取得・利用しています。 これ以降ページを遷移した場合、Cookieなどの設定や使用に同意したことになります。
Cookieなどの設定や使用の詳細、オプトアウトについては詳細をご覧ください。
[ 閉じる ]