[ Topページへ戻る ]
2010.4.11よりアクセス
Java Enterprise Edition 6 (Java EE 6)の仕様であるJSR-316は、2009年12月に確定されました。
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については、マイナーバージョンアップされました。
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ブームですっかり状況が変わってきています。
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に一本化する動きのようです。
オープンソース(LGPL)でアプリケーションサーバを公開し、サポートを有償で行うビジネスモデルを適用していたJBossでしたが、2006年にJBossがRed Hat社に買収され、現在はRed Hatの製品となっています。オープンソース(LGPL)のCommunity版と有償(サブスクリプション契約)のEnterprise版(内容はCommunity版を含む)とが提供されています。2010/4/30現在、Java EE 6に対応するバージョン6.0は開発途上(マイルストンM2が公開)です。
Sun Microsystemsで、Java EE参照実装及び商用製品として開発されていました。OracleによるSunの買収にともない、現在Oracleの製品となっていますが、オープンソース版と商用サポートは継続するようです。オープンソース版はCDDL/GPLのデュアルライセンスとなっています。2010/4/30現在、Java EE 6に対応したバージョン3.0がリリースされています。
IBMのJava EE対応アプリケーションサーバ製品。2010/4/30現在、Java EE 6に対応するバージョン8.0は開発途上。
無償のWebSphere Application Server Community Edition(ソース非公開)は、Apacheプロジェクトで開発されているオープンソースのJava EEサーバであるGeronimoをベースとしています。
Apacheプロジェクトの1つとして開発されています。
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に含まれるのは、以下です。
Oracle Sun Developer NetworkのJava EEページより、Java EE 6 SDKをダウンロードします。
実行すると、Java EE 6 SDKインストーラが表示されるので、[次へ]→ライセンスに同意し、[次へ]を押します。
インストールディレクトリを聞いてくるので、適切なディレクトリ(例、D:\Program Files (x86)\Java\glassfishv3)を指定し、[次へ]を押します。
将来記述予定
コマンドラインでサーバーを起動することができます。
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]
コマンドラインでサーバーを終了することができます。
D:\work> d:\java\javaee5\bin\asadmin.bat stop-domain domain1 Waiting for the domain to stop .... Command stop-domain executed successfully. D:\work>
「J2EE 1.4を弄ぶ」ページでJ2EE 1.4用に作成した課題図書アプリケーションをJava EE 6に書き換えてみました。
専用クライアントからもアクセスできるリモートEJBコンポーネントの開発手順は以下となります。
J2EE 1.4のときと比べて、手順が大幅に簡略化されています。Java EE 5のEJB3.0では、開発の簡素化(Ease of Development)がスローガンとして叫ばれ、仕様が見直されました。Java EE 6のEJB3.1では、さらに簡素化が進んでいます。
リモートからアクセスできる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(); }
ステートレスセッションビーンの実装クラスを作成します。
package jp.gr.java_conf.torutk.ejb.javareading; import javax.ejb.Stateless; @Stateless public class AssignmentBean implements Assignment { @Override public String getCurrentTitle() { return "Scalaスケーラブルプログラミング"; } }
[ファイル]メニュー→[新規プロジェクト]を選ぶと、「新規プロジェクト」ウィザードが表示されます。
上で作成したプロジェクト"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は省略可能