[ Topページへ戻る ]

2010.4.11よりアクセス

Java Enterprise Edition 6 (Java EE 6)の仕様であるJSR-316は、2009年12月に確定されました。

Java EE 6 仕様概要

Java EEの主要機能は、トランザクション・ビジネスロジックを実現するEJBコンテナ、Webプレゼンテーションを実現するWebコンテナ、Webサービス、通信、その他から構成されます。それぞれについて、仕様の更新状況を簡単にまとめます。

EJBコンテナについては、Java EE 5におけるEJB 3.0からEJB 3.1にマイナーバージョンアップされました。開発の容易化を促進する改善が入りました。さらにPOJOに近い記述ができるようになっています。配布方法も改善され、warファイルに含めたり、Java SE上で使用可能になりました。Singleton Session Beansが追加され、クラスタ等コンテナを跨いだシングルトンが実現できるようになりました。一方、Entity BeanはJPAに置き換わり、互換性のために残されていますが、使用されなくなっています。

参考資料

Webコンテナについては、まず、Java EE 5におけるServlet 2.4からServlet 3.0とメジャーバージョンアップされました。非同期処理、アノテーションに基づく設定(web.xmlファイルはオプション)、web.xmlの分割など、大きく改善されています。非同期対応は、Ajaxサポートの一環です。

次に、Java EE 5におけるJSF 1.2からJSF 2.0にメジャーバージョンアップされました。Ajaxサポートが入っています。主要なものはパーシャル・ページ・アップデートとパーシャル・ビュー・トラバーサル対応です。また、いくつか拡張も加えられています。

Java EE 5におけるJSP 2.1からJSP2.2にマイナーバージョンアップされました。合わせて、JSTLも1.1から1.2にマイナーバージョンアップされています。

Webサービスについては、新たにJava API for RESTful Web Service(JAX-RS)が追加されました。Web Service、JAX-WS、JAXBについては、マイナーバージョンアップされました。

Java EEの実装系

EJB 1.0の仕様が策定されたのが1997年、最初のJava Platform, Enterprise Editionの仕様であるJ2EE 1.2が1999年12月に制定されました。それ以後、J2EE 1.3、J2EE 1.4、Java EE 5、と仕様のバージョンアップが行われてきました。この間、いくつもの実装系が登場しました。こうしたJava EEの実装系(アプリケーションサーバ)も、昨今のM&Aブームですっかり状況が変わってきています。

Java EE対応製品

Oracle WebLogic Server(商用製品)

WebLogicが1998年にBEA Systemsに買収され、その後WebLogic Server 5.1がJ2EE 1.2仕様を実装した製品としてリリースされています。JRockitと呼ばれる独自の高速なJavaVMを持ち、高速性を誇るWebLogic Serverです。その後、2008年にBEA SystemsはOracle社に買収され、現在はOracle WebLogic Serverとして販売されています。2010/4/30現在の最新版である Oracle WebLogic Server 11g Release 1(10.3.2)は、Java EE 6に対応しています。

なお、Oracle自身もJava EE対応製品であるOracle Application Serverを開発していましたが、今後はWebLogic Serverに一本化する動きのようです。

Red Hat JBoss (オープンソース製品、商用サポート)

オープンソース(LGPL)でアプリケーションサーバを公開し、サポートを有償で行うビジネスモデルを適用していたJBossでしたが、2006年にJBossがRed Hat社に買収され、現在はRed Hatの製品となっています。オープンソース(LGPL)のCommunity版と有償(サブスクリプション契約)のEnterprise版(内容はCommunity版を含む)とが提供されています。2010/4/30現在、Java EE 6に対応するバージョン6.0は開発途上(マイルストンM2が公開)です。

Oracle GlassFish Server(オープンソース製品、商用製品)

Sun Microsystemsで、Java EE参照実装及び商用製品として開発されていました。OracleによるSunの買収にともない、現在Oracleの製品となっていますが、オープンソース版と商用サポートは継続するようです。オープンソース版はCDDL/GPLのデュアルライセンスとなっています。2010/4/30現在、Java EE 6に対応したバージョン3.0がリリースされています。

IBM WebSphere Application Server(商用製品)

IBMのJava EE対応アプリケーションサーバ製品。2010/4/30現在、Java EE 6に対応するバージョン8.0は開発途上。

IBM WebSphere Application Server Community Edition(無償製品、商用サポート)

無償のWebSphere Application Server Community Edition(ソース非公開)は、Apacheプロジェクトで開発されているオープンソースのJava EEサーバであるGeronimoをベースとしています。

Apache Geronimo(オープンソース)

Apacheプロジェクトの1つとして開発されています。

NEC WebOTX(商用製品)

日立 uCosminexus Application Server(商用製品)

富士通 Interstage Application Server(商用製品)

Java EE 6(GlassFish)を動かそう

GlassFishを動かすには、Java EE 6 SDK が必要です。Java EEは、別途Java SEを必要とするので、Java SE 6 SDKがなければ、まずJava SE 6 SDKをインストールします。

なお、NetBeans 6.8以降のJava開発用をダウンロード・インストールすると、GlassFish Ver.3が一緒にインストールされるので、そちらを利用する人はJava EE 6 SDKのインストールは不要です。

Java EE 6 SDKに含まれるのは、以下です。

Java EE 6 SDKのインストール

WindowsへのJava EE 6 SDKインストール

Oracle Sun Developer NetworkのJava EEページより、Java EE 6 SDKをダウンロードします。

実行すると、Java EE 6 SDKインストーラが表示されるので、[次へ]→ライセンスに同意し、[次へ]を押します。

インストールディレクトリを聞いてくるので、適切なディレクトリ(例、D:\Program Files (x86)\Java\glassfishv3)を指定し、[次へ]を押します。

GlassFishのインストール

将来記述予定

GlassFishの起動

アプリケーションサーバーの起動

コマンドラインでサーバーを起動することができます。

D:\work> D:\java32\sges-v3\bin\asadmin.bat stard-domain domain1
Waiting for DAS to start ..............
Started domain: domain1
Domain location: D:\java32\sges-v3\glassfish\domains\domain1
Log file: D:\java32\sges-v3\glassfish\domains\domain1\logs\server.log
Admin port for the domain: 4848
Command start-domain executed successfully.

D:\work> 

起動したか確認するために、ブラウザで、"http://localhost:8080" にアクセスしてみます。

Sun GlassFish Enterprise Server v3

「Your server is now running」とのページが表示されれば確認OKです。

デフォルト設定内容

設定項目 デフォルト値 備考
domain.name
domain1
instance.name
server
admin.user
admin
admin.password
adminadmin
admin.port
4848
instance.port
8080
orb.port
3700
imq.port
7676
https.port
8181

起動時のオプションで設定可能な項目

start-domainのコマンドラインオプションで設定項目を指定することができます。

使用法: start-domain [--terse=false] [--echo=false] [--interactive=true] --user
admin_user [--passwordfile file_name] [--domaindir domain_directory] [--verbose=
false] [--debug] [domain_name]

Java EEサーバーの終了

コマンドラインでサーバーを終了することができます。

D:\work> d:\java\javaee5\bin\asadmin.bat stop-domain domain1
Waiting for the domain to stop ....
Command stop-domain executed successfully.

D:\work>

初めてのJava EEアプリケーション

J2EE 1.4を弄ぶ」ページでJ2EE 1.4用に作成した課題図書アプリケーションをJava EE 6に書き換えてみました。

EJBコンポーネントの作成方法

専用クライアントからもアクセスできるリモートEJBコンポーネントの開発手順は以下となります。

  1. ビジネスインタフェース(リモート)の作成
  2. Beanクラスの作成
  3. 配備するためのアーカイブ作成
  4. 配布

J2EE 1.4のときと比べて、手順が大幅に簡略化されています。Java EE 5のEJB3.0では、開発の簡素化(Ease of Development)がスローガンとして叫ばれ、仕様が見直されました。Java EE 6のEJB3.1では、さらに簡素化が進んでいます。

セッションBeanの作成

設計

ビジネスインタフェース(リモート)の作成

リモートからアクセスできるEJBを作成するときは、インタフェースを作成します。通常のJavaのinterface(POJI)に、アノテーション@Remoteを追加しただけの記述です。なお、リモートからアクセスするインタフェースは、引数・戻り値としてプリミティブ型、String型、またはSerializable実装型を使用します。

package jp.gr.java_conf.torutk.ejb.javareading;

import javax.ejb.Remote;

@Remote
public interface Assignment {
    String getCurrentTitle();
}

実装

Beanクラスの作成

ステートレスセッションビーンの実装クラスを作成します。

package jp.gr.java_conf.torutk.ejb.javareading;

import javax.ejb.Stateless;

@Stateless
public class AssignmentBean implements Assignment {

    @Override
    public String getCurrentTitle() {
        return "Scalaスケーラブルプログラミング";
    }
 }

NetBeans での開発

プロジェクト"JavaReadingAssignment"の作成

[ファイル]メニュー→[新規プロジェクト]を選ぶと、「新規プロジェクト」ウィザードが表示されます。

ステップ1「プロジェクトを選択」
カテゴリ欄から[Java EE]を選択し、プロジェクト欄から[EJBモジュール]を選択し、[次へ]ボタンを押します。
ステップ2「名前と場所」
プロジェクト名に[JavaReadingAssignment]と入力し、プロジェクトの場所は適切なディレクトリを指定します。「主プロジェクトとして設定」にチェックを入れます。[次へ]ボタンを押します。
ステップ3「サーバーと設定」
サーバー欄から「GlassFish Server 3」を選択します。Java EEバージョン欄から「Java EE 6」を選択します。[完了]ボタンを押します。

セッションビーンAssignmentBeanの作成

上で作成したプロジェクト"JavaReadingAssignment"を右クリックし、ポップアップメニューから[新規]→[セッションBean]を選ぶと、「新規セッションBean」ウィザードが表示されます。

EJB名に[AssignmentBean]と入力し、パッケージ欄に[jp.gr.java_conf.torutk.ejb.javareading]と入力します。セッションのタイプは[ステートレス]を選択し、インタフェースを作成で[リモート]にチェックを入れます。[完了]ボタンを押します。

すると、プロジェクトツリーの下に、指定したjp.gr.java_conf.torutk.ejb.javareadingパッケージとその中に以下2つのファイルが生成されます。

リモートインタフェースの名前がちょっと気に入らないので(インタフェース名は自然な名前、プログラム上の仕組みを表す接尾辞は付けたくない)、[リファクタリング]メニュー→[名前を変更]で、AssignmentBeanRemoteからAssignmentに変更します。すると、ファイル名、AssignmentBean側のimplements以降も合わせて変更されます。

次に、Assignmentインタフェースにビジネスメソッド getCurrentTitleを追加します。
ここで、AssignmetBeanに警告マーク(!)が付きます。未実装のメソッドが検出されたからです。AssginmentBeanのクラス定義の行に表示されるランプマークをクリックし、「すべての抽象メソッドを実装」を選択します。

または、先にAssignmentBean側の編集画面で、右クリック→[コードを挿入]→[ビジネスメソッドを追加]を選択し、「ビジネスメソッドを追加」ダイアログが表示されるので、名前にgetCurrentTitle、戻り値の型にString、パラメータおよび例外はなし、リモートにチェックが入っていることを確認し[了解]を押します。リモートインタフェースにも自動的に宣言が追加されます。

実行

NetBeansから実行する場合、プロジェクトツリーから該当プロジェクト(今回はJavaReadingAssignment)を選択し、右クリックで[実行]または[Deploy]を選択すればOKです。アプリケーションサーバ(GlassFish)が未稼動であれば起動され、デプロイされます。

ブラウザで、localhost:4848 にアクセスすれば、GlassFishの管理機能につながります。Common Tasksの[List Deployed Applications]をクリックするか、左側メニューの[Applications]をクリックすれば、現在GlassFishにデプロイ中のモジュール一覧が確認できます。

リモートからのアクセス

EJBに対してリモートからアクセスするクライアントを作成し、動作確認を行います。

基本は、JNDIでリモートEJBの参照を取得し、それに対してリモートメソッド呼び出しを行います。リモートEJBとの通信プロトコルは、RMI/IIOPなので、裏ではCORBAネーミングサービスに接続し、EJB名を指定してCORBAリファレンスを取得し、その参照に対してCORBAオペレーションを呼び出しています(そのはず)。

クライアントの作成

Main.java

import javax.naming.InitialContext;
import javax.naming.NamingException;
import jp.gr.java_conf.torutk.ejb.javareading.Assignment;

public class Main {
    private static final String ADDRESS = 
        "java:global/JavaReadingAssignment/AssignmentBean";              // (3)
    
    public static void main(String[] args) {
        try {
            InitialContext context = new InitialContext();               // (1)
            Assignment assignment = (Assignment)context.lookup(ADDRESS); // (2)
            String title = assignment.getCurrentTitle();
            System.out.println("課題図書は、" + title + " です。");
        } catch (NamingException ex) {
            System.err.println("JNDI InitialContext lookup error:" + ex);
            return;
        }
    }
}

(1) GlassFish Server Ver.3を使用する場合、JNDIのInitialContextは引数なしのコンストラクタで生成します。

(2) クライアントは、Java SE環境(Java EEコンテナ管理外)で実行するので、リモートEJBの参照を取得する方法はDI(Dependency Injection)による暗黙的取得ではなく、明示的にJNDIの検索で取得します。

(3) JNDIアドレス形式はグローバル形式で指定します。なお、GlassFishへEJBをデプロイするときに、ログにアドレス文字列が出力されます。

java:global[/アプリケーション名]/モジュール名/エンタープライズビーン名[/インタフェース名]
    アプリケーション名:EARファイルにパッケージしたBeanを指定する場合必要
    モジュール名:
    エンタープライズビーン名:
    インタフェース名:複数のビジネスインタフェースを実装しているビーンの場合必要

GlassFish Serverへデプロイ時にログ出力されるアドレス名

情報: Portable JNDI names for EJB AssignmentBean : [java:global/JavaReadingAssignment/
AssignmentBean!jp.gr.java_conf.torutk.ejb.javareading.Assignment,
 java:global/JavaReadingAssignment/AssignmentBean]

クライアントのコンパイル

GlassFish Server Ver.3(Java EE 6)の場合、コンパイル時に以下をクラスパスに追加します。

D:\work\JavaReadingAssignmentClient> 
javac -cp D:\work\JavaReadingAssignment\dist\JavaReadingAssignment.jar Main.java

D:\work\JavaReadingAssignmentClient>

クライアントの実行

GlassFish Server Ver.3(Java EE 6)の場合、実行時に以下をクラスパスに追加します。

EJBを配備したGlassFish Serverがクライアント実行マシンと異なる場合、システムプロパティ"org.omg.CORBA.ORBInitialHost"にサーバ実行マシンのホスト名を指定します。省略時はlocalhostとなります。

GlassFish ServerのIIOPリスナーポート(orb-listener-1)をデフォルトの3700以外に変更している場合、システムプロパティ "org.omg.CORBA.ORBInitialPort"にポート番号を指定します。省略時は3700となります。

D:\work\JavaReadingAssignmentClient> 
java -cp D:\work\JavaReadingAssignment\dist\JavaReadingAssignment.jar;
"D:\Program Files (x86)\Java\glassfish\glassfish\modules\gf-client.jar";.
 -Dorg.omg.CORBA.ORBInitialHost=localhost Main

2010/05/05 0:14:35 com.sun.enterprise.transaction.JavaEETransactionManagerSimpli
fied initDelegates
情報: Using com.sun.enterprise.transaction.jts.JavaEETransactionManagerJTSDelega
te as the delegate
課題図書は、Scalaスケーラブルプログラミング です。

D:\work\JavaReadingAssignmentClient>

注記) -Dorg.omg.CORBA.ORBInitialHost=localhostは省略可能