Maven を使用したエンタープライズアプリケーションの作成
このチュートリアルでは、NetBeans IDE と Maven 原型を使用して、単純なエンタープライズアプリケーションを作成する方法を示します。また、IDE を使用して Maven アプリケーションを作成および構築する方法についても説明し、そのヒントを示します。
このチュートリアルでは、EAR アーカイブとしてパッケージ化され、GlassFish Server Open Source Edition 3 に配備されるエンタープライズアプリーケーションを作成します。アプリケーションの作成には、「新規プロジェクト」ウィザードで Maven エンタープライズアプリケーション原型を使用します。アプリケーションには EJB プロジェクトが含まれますが、これには持続エンティティークラス、メッセージ駆動型 Bean、およびエンティティーのセッション Bean ファサードが含まれます。アプリケーションには、2 つのサーブレットから成る 1 つの Web プロジェクトも含まれます。
チュートリアルの課題
このチュートリアルに従うには、次のソフトウェアとリソースが必要です。
注: NetBeans IDE 6.9 および GlassFish サーバー 3.x には、Java Development Kit (JDK) 6 が必要です。
前提条件
このドキュメントは、次のテクノロジについて基本的な知識またはプログラミング経験を持つ読者を想定して書かれています。
- Java プログラミング
- NetBeans IDE
このチュートリアルを開始する前に、必要に応じて次のドキュメントをお読みください。
完了したプロジェクトの ZIP アーカイブはダウンロードできます。
IDE での Maven の使用
NetBeans IDE には、Maven のサポートが完全に統合されています。Maven フレームワークを使用するプロジェクト開発は、Ant でのプロジェクト開発とほぼ同じです。ただし、Maven によるプロジェクトの構築方法および依存関係の処理方法には、いくつかの違いがあります。次のヒントは、Maven アプリケーションをはじめて作成する場合に発生するいくつかの問題を回避するのに役立ちます。
Maven の設定の確認
これがはじめての Maven プロジェクトである場合は、「オプション」ウィンドウで Maven の構成設定を確認します。NetBeans IDE 7.0 以降では、Maven は IDE にバンドルされており、IDE をインストールするときにインストールされます。NetBeans IDE 6.9 またはそれ以前のバージョンの IDE を使用する場合は、Maven のサイトからインストーラをダウンロードできます。
- IDE で「オプション」ウィンドウを開きます。
- 「オプション」ウィンドウの「その他」カテゴリを選択して、「Maven」タブをクリックします。
- 「Maven のホーム」が指定されていることを確認します。
IDE にバンドルされている Maven バージョンを使用することも、ローカルの Maven インストール (2.0.9 以降が必要) の場所を指定することもできます。
- 「了解」をクリックして「オプション」ウィンドウを閉じます。
注: 以前に IDE で Maven プロジェクトを作成したことがない場合は、最初に IDE で Maven モジュールを有効化する必要があります。これは、「新規プロジェクト」ウィザードで Maven プロジェクトの原型を選択することによって実行できます。原型を選択すると、IDE によって、このモジュールが自動的に有効にされます。IDE で Maven を有効にするために、このウィザードを完了する必要はありません。
Maven リポジトリの更新
ローカルおよびリモートの Maven リポジトリは、コード補完、およびプロジェクト構築時に使用されます。プロジェクトの開発時に、必要な任意のアーティファクトをすぐに使用できるように、Maven リモートリポジトリの索引を更新しておきます。「オプション」ウィンドウの「Maven」タブでは、IDE が更新を確認する頻度を構成できます。Maven リポジトリブラウザでは、更新の有無を即時確認でき、ローカルおよびリモートの Maven リポジトリを調べることができます。
- 「ウィンドウ」>「その他」>「Maven リポジトリブラウザ」を選択します。
- Maven リポジトリブラウザウィンドウの上部にある「索引を更新」(
) をクリックします。
「索引を更新」をクリックすると、各 Maven リモートリポジトリの最新の索引の有無が確認され、ダウンロードされます。索引は、リポジトリ内に存在するアーティファクトの現在の状態を示し、アプリケーションで使用できるアーティファクトへの参照を提供するために使用されます。デフォルトでは、アーティファクトが明示的に要求されないかぎり、リポジトリからアーティファクトはダウンロードされません。
注: 索引のサイズは非常に大きく、すべて更新するのに時間がかかる可能性があります。
NetBeans IDE での Maven の使用に関する詳細は、「Hibernate を使用した Maven Swing アプリケーションの作成」チュートリアルの「Maven の構成」、および「NetBeans IDE での Apache Maven のベストプラクティス」を参照してください。
Maven エンタープライズアプリケーションプロジェクトの作成
この課題の目標は、IDE に付属する Maven エンタープライズアプリケーションの原型を使用して、エンタープライズアプリケーションプロジェクトを作成することです。エンタープライズアプリケーションの原型によって、EJB プロジェクトおよび Web アプリケーションプロジェクトも作成されます。
IDE の「新規プロジェクト」ウィザードには、いくつかの Maven 原型が含まれます。これらを使用すると、エンタープライズアプリケーションプロジェクト (EAR)、Web アプリケーションプロジェクト (WAR)、EJB モジュールプロジェクト (JAR) などの一般的な NetBeans プロジェクト型を簡単に作成できます。このウィザードを使用すると、登録済みのリモートリポジトリ内の原型からプロジェクトを作成することもできます。
- メインメニューから「ファイル」>「新規プロジェクト」(Ctrl-Shift-N、Mac の場合は ⌘-Shift-N) を選択します。
- 「Maven」カテゴリから「エンタープライズアプリケーション」を選択します。「次へ」をクリックします。
- 「プロジェクト名」として「MavenEnterpriseApp」と入力し、プロジェクトの場所を設定します。
- (任意) アーティファクトの詳細を修正します。「次へ」をクリックします。
- 「サーバー」として「GlassFish Server 3.1.1」を選択します。
- 「Java EE バージョン」を「Java EE 6」に設定します。
- 「EJB モジュールを作成」および「Web アプリケーションモジュールを作成」を選択します。「完了」をクリックします。
「完了」をクリックすると、Maven エンタープライズアプリケーション原型から次のプロジェクトが作成されます。
- EJB。(MavenEnterpriseApp-ejb) EJB プロジェクトには通常、ソースコードおよびアプリケーションのビジネスロジックが含まれます。EJB プロジェクトは EJB JAR アーカイブとしてパッケージ化されます。
- Web アプリケーション。(MavenEnterpriseApp-web) Web アプリケーションプロジェクトには通常、アプリケーションのプレゼンテーションレイヤー (JSF ページや JSP ページなど)、およびサーブレットが含まれます。Web アプリケーションプロジェクトには、ソースコードおよびビジネスロジックが含まれる場合もあります。Web アプリケーションプロジェクトは WAR アーカイブとしてパッケージ化されます。
- アセンブリ。(MavenEnterpriseApp) アセンブリプロジェクトは、EJB アーカイブおよび WAR アーカイブから EAR アーカイブをアセンブルするために使用されます。アセンブリプロジェクトには、ソースが含まれていません。
- エンタープライズアプリケーション。(MavenEnterpriseApp-ear) エンタープライズアプリケーションプロジェクトには、ソースが含まれていません。エンタープライズアプリケーションに含まれるのは POM ファイル (pom.xml) のみで、これにはエンタープライズアプリケーションに含まれるモジュールの詳細が記述されています。
エンタープライズアプリケーションプロジェクトを作成すると、一部の依存リソースが使用できないため、エンタープライズアプリケーションプロジェクトにバッジが表示されます。MavenEnterpriseApp-ear プロジェクトの「依存リソース」ノードを展開すると、存在しないか、またはクラスパス上にないライブラリがプロジェクトによって必要とされていることを確認できます。
「プロジェクト」ウィンドウで「依存リソース」ノードの下の「非クラスパスの依存リソース」項目を右クリックし、「依存リソースを展開」を選択すると、存在しない依存リソースを確認できます。
エンタープライズアプリケーションプロジェクトは JAR および WAR に対して依存関係がありますが、これらは EJB プロジェクトおよび Web プロジェクトのコンパイル後にパッケージ化され、使用可能になります。アーティファクト MavenEnterpriseApp-ejb-1.0-SNAPSHOT および MavenEnterpriseApp-web-1.0-SNAPSHOT が依存リソースとして一覧表示されていることがわかります。
ステータスバーの Maven アイコンをクリックすると、プライミングビルドを実行して存在しない依存関係を解決できます。
ターゲットサーバーの指定
NetBeans IDE 7.1 では、「新規プロジェクト」ウィザードでターゲットサーバーを設定できます。以前のバージョンの IDE では、プロジェクトの「プロパティー」ウィンドウでターゲットサーバーを設定する必要があります。
通常、Maven アプリケーションを開発するときは、アプリケーションを構築するまでアプリケーションサーバーを指定する必要がありません。しかし、IDE のいくつかのコード生成機能を活用するため、このチュートリアルでは、コードの記述を開始する前にターゲットサーバーを設定します。配備先サーバーを設定することによって、IDE はこのサーバーによってサポートされるテクノロジを認識できます。また、このサーバー用に最適化されるコードを生成するためのオプションが有効になります。
- GlassFish サーバーを起動します。
- 「プロジェクト」ウィンドウで EJB プロジェクトのノードを右クリックし、「プロパティー」を選択します。
- 「実行」カテゴリを選択し、GlassFish Server を選択します。「了解」をクリックします。
コーディングの前に配備先サーバーとして GlassFish を指定することで、持続性ユニットの作成用ウィザードで、JTA を選択するオプションが有効になります。また、サーバーに登録されている任意のデータソースの使用を選択することもできます。
注: GlassFish Server 3 を指定しない場合、持続性ユニットを作成する際のデフォルトのトランザクションタイプは RESOURCE-LOCAL となります。コンテナでトランザクションを管理する場合は、手動で persistence.xml ファイルを編集し、JTA を指定する必要があります。また、「新規持続性ユニット」ウィザードでは、登録済みのデータソースではなく、データベース接続を指定する必要があります。
EJB プロジェクトのコーディング
EJB プロジェクトには、アプリケーションのビジネスロジックが含まれます。このアプリケーションでは、GlassFish コンテナは Java Transaction API (JTA) を使用してトランザクションを管理します。このチュートリアルでは、EJB プロジェクトで、エンティティークラス、メッセージ駆動型 Bean、およびエンティティークラスのセッションファサードを作成します。
持続性ユニットの作成
この課題では、EJB プロジェクトで持続性ユニットを作成します。持続性ユニットは、データベース接続の詳細、およびトランザクションの管理方法を指定します。このアプリケーションでは、GlassFish サーバーでトランザクションを管理するため、「新規持続性ユニット」ウィザードで JTA を指定します。
持続性ユニットを作成するには、次の手順に従います。
- EJB プロジェクトノードを右クリックし、ポップアップメニューから「新規」>「その他」を選択して、「新規ファイル」ウィザードを開きます。
- 「持続性」カテゴリから「持続性ユニット」を選択します。「次へ」をクリックします。
- 「新規持続性ユニット」ダイアログで、「持続性プロバイダ」として「EclipseLink」を選択します。
- データソースを選択します (たとえば、JavaDB を使用する場合はjdbc/sample を選択)。
データソース jdbc/sample は、IDE および GlassFish サーバーのインストール時に IDE にバンドルされますが、別のデータベースを使用する場合はほかのデータソースを指定することもできます。
ほかのデフォルトオプション (持続性ユニット名、EclipseLink 持続性プロバイダ) はそのまま使用できます。
- 「Java Transaction API を使用」が選択されており、「表生成の方針」が「作成」に設定されていることを確認します。これにより、アプリケーションの配備時に、エンティティークラスに基づいて表が作成されます。「完了」をクリックします。
「完了」をクリックすると、XML ファイル persistence.xml が作成され、エディタでこのファイルが開かれます。「プロジェクト」ウィンドウでは、「その他のソース」>「src/main/resources」>「META-INF」 ディレクトリ内で、このファイルが作成されたことを確認できます。このファイルには、データベースとの接続、およびトランザクションの管理方法についての詳細が記述されています。エディタで「ソース」タブをクリックすると、次のような持続性ユニットの詳細を表示できます。
...
<persistence-unit name="com.mycompany_MavenEnterpriseApp-ejb_ejb_1.0-SNAPSHOTPU" transaction-type="JTA">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<jta-data-source>jdbc/sample</jta-data-source>
<exclude-unlisted-classes>false</exclude-unlisted-classes>
<properties>
<property name="eclipselink.ddl-generation" value="create-tables"/>
</properties>
</persistence-unit>
トランザクションタイプとして JTA が指定されていること、およびアプリケーションが登録済みデータソース jdbc/sample を使用することを確認できます。
エンティティークラスの作成
この課題では、EJB プロジェクトで、データベースに維持されるオブジェクトを表すエンティティークラスを作成します。NewsEntity エンティティークラスを作成するには、次の手順に従います。
- 「プロジェクト」ウィンドウで EJB モジュールを右クリックし、「新規」>「その他」を選択して「新規ファイル」ウィザードを開きます。
- 「持続性」カテゴリから「エンティティークラス」を選択します。「次へ」をクリックします。
- クラス名に「NewsEntity」と入力します。
- 「パッケージ」に「ejb」と入力し、「主キーの型」は「Long」のままにします。「完了」をクリックします。
「完了」をクリックすると、エンティティークラス NewsEntity.java がソースエディタに表示されます。ソースエディタで次の手順を実行し、いくつかのフィールドを追加します。
- このクラスに次のフィールド宣言を追加します。
private String title;
private String body;
- ソースエディタ内のクラス定義の間を右クリックし、「コードを挿入」(Alt-Insert、Mac の場合は Ctrl-I) >「取得メソッドおよび設定メソッド」を選択します。
- 「取得メソッドおよび設定メソッドの生成」ダイアログで、body フィールドおよび title フィールドを選択します。「生成」をクリックします。
- 変更内容をクラスに保存します。
メッセージ駆動型 Bean の作成
この課題では、EJB プロジェクトでメッセージ駆動型 Bean を作成します。メッセージ駆動型 Bean は、非同期でのメッセージ交換を可能にするエンタープライズ Bean です。NewsApp アプリケーションは、メッセージ駆動型 Bean を使用して、Web モジュール内でサーブレットがキューに送信するメッセージの受信および処理を行います。
アプリケーションでメッセージ駆動型 Bean を使用するには、Bean によって使用されるコネクタリソースをサーバーに登録する必要があります。GlassFish サーバーに配備する場合、管理コンソールを使用してサーバー上にリソースを直接作成できますが、glassfish-resources.xml 記述子ファイルに詳細を指定することで配備時にリソースを作成することもできます。アプリケーションがサーバーに配備されると、サーバーは記述子ファイルに基づいてリソースを登録します。IDE の「新規ファイル」ウィザードを使用してメッセージ駆動型 Bean を作成する場合、記述子ファイル内の要素が IDE によって生成されます。
Maven プロジェクトでは、「ファイル」ウィンドウのプロジェクトノードの下の src/main/setup ディレクトリに glassfish-resources.xml ファイルがあります。
- 「プロジェクト」ウィンドウで EJB モジュールを右クリックし、「新規」>「その他」を選択して「新規ファイル」ウィザードを開きます。
- 「エンタープライズ JavaBeans」カテゴリから「メッセージ駆動型 Bean」を選択します。「次へ」をクリックします。
- EJB 名に「NewMessage」と入力します。
- 「パッケージ」ドロップダウンリストから「 ejb 」を選択します。
- 「プロジェクトの送信先」フィールドの横の「追加」ボタンをクリックして「メッセージ送信先を追加」ダイアログを開きます。
- 「メッセージ送信先を追加」ダイアログで「jms/NewMessage」と入力し、送信先タイプに「キュー」を選択します。「了解」をクリックします。
- プロジェクトの送信先が正しいことを確認します。「完了」をクリックします。
「完了」をクリックすると、Bean クラスが生成され、クラスをメッセージ駆動型 Bean と特定する次の注釈、および構成プロパティーが追加されます。
@MessageDriven(mappedName = "jms/NewMessage", activationConfig = {
@ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge"),
@ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue")
})
public class NewMessage implements MessageListener {
public NewMessage() {
}
public void onMessage(Message message) {
}
}
- 次の注釈済みフィールドをクラスに追加して、MessageDrivenContext リソースをクラスに注入します。
public class NewMessage implements MessageListener {
@Resource
private MessageDrivenContext mdc;
- 次の注釈済みフィールド (ボールド部分) を追加して、エンティティーマネージャーをクラスに導入します。
public class NewMessage implements MessageListener {
@Resource
private MessageDrivenContext mdc;
@PersistenceContext(unitName="com.mycompany_MavenEnterpriseApp-ejb_ejb_1.0-SNAPSHOTPU")
private EntityManager em;
@PersistenceContext 注釈は、持続性ユニットを宣言することで、コンテキストを指定します。unitName 値は、持続性ユニットの名前です。
- 次の save メソッド (ボールド部分) を追加します。
public NewMessage() {
}
public void onMessage(Message message) {
}
private void save(Object object) {
em.persist(object);
}
- 本文に次のコード (ボールド部分) を追加して、onMessage メソッドを修正します。
public void onMessage(Message message) {
ObjectMessage msg = null;
try {
if (message instanceof ObjectMessage) {
msg = (ObjectMessage) message;
NewsEntity e = (NewsEntity) msg.getObject();
save(e);
}
} catch (JMSException e) {
e.printStackTrace();
mdc.setRollbackOnly();
} catch (Throwable te) {
te.printStackTrace();
}
}
- インポート文を修正 (Ctrl-Shift-I、Mac の場合は ⌘-Shift-I) して変更内容を保存します。
注: インポート文の生成時に、jms と javax.annotation.Resource の各ライブラリを必ずインポートします。
メッセージ駆動型 Bean の詳細については、「Java EE 6 チュートリアル、パート 1」の章「メッセージ駆動型 Bean とは」を参照してください。
セッション Bean の作成
この課題では、ウィザードを使用して、NewsEntity エンティティークラスのセッション Bean ファサードを作成します。このウィザードにより、一般的ないくつかのメソッド create、edit、および find が生成されます。これらは、Web アプリケーションプロジェクトのサーブレットからアクセスできます。
- EJB モジュールを右クリックし、「新規」>「その他」を選択します。
- 「持続性」カテゴリから「エンティティークラスのセッション Bean」を選択し、「次へ」をクリックします。
- 利用可能なエンティティークラスのリストから ejb.NewsEntity を選択し、「追加」をクリックして、そのクラスを「選択されているエンティティークラス」区画に移動します。「次へ」をクリックします。
- 「パッケージ」として「ejb」を選択します。
- インタフェースを作成する必要はありません。「完了」をクリックします。
「完了」をクリックすると、抽象ファサードクラスを拡張した AbstractFacade.java と NewsEntityFacade.java という 2 つのセッションファサードクラスが IDE によって生成されます。抽象ファサードクラスには、エンティティークラスでよく使用される複数のメソッドが定義されています。
Java EE 6 では、インタフェースは任意です。Java EE 5 では、セッション Bean のローカルインタフェースを作成してから、このインタフェースを使用してセッション Bean を呼び出す必要がありました。Java EE 6 では、ローカルインタフェースは任意です。Web モジュールのサーブレットは、インタフェースのないファサードを使用してセッション Bean に直接アクセスできます。
Web アプリケーションのコーディング
この節では、Web アプリケーションプロジェクトに 2 つのサーブレットを作成します。
ListNews サーブレットの作成
この課題では、送信済みメッセージのリストを表示するために使用される、ListNews サーブレットを作成します。注釈を使用してセッションファサードを注入し、findAll メソッドにアクセスして、送信済みメッセージを取得します。
- Web モジュールプロジェクトを右クリックし、「新規」>「サーブレット」を選択します。
- 「クラス名」に「ListNews」と入力します。
- 「パッケージ名」に「web」と入力します。「完了」をクリックします。
「完了」をクリックすると、 ListNews.java というクラスがソースエディタに表示されます。
- ソースエディタ内のクラス定義の間を右クリックし、「コードを挿入」(Alt-Insert、Mac の場合は Ctrl-I) >「エンタープライズ Bean を呼び出し」を選択します。
- 「エンタープライズ Bean を呼び出し」ダイアログボックスで、「MavenEnterpriseApp-ejb」ノードを展開し、「NewsEntityFacade」を選択します。「了解」をクリックします。
「了解」をクリックすると、@EJB という注釈を使用して、EJB リソースがサーブレットに注入されます。
@WebServlet(name = "ListNews", urlPatterns = {"/ListNews"})
public class ListNews extends HttpServlet {
@EJB
private NewsEntityFacade newsEntityFacade;
- processRequest メソッドで、以下の行 (ボールド部分) をメソッドの本体に追加することでメソッドを変更します。
out.println("<h1>Servlet ListNews at " + request.getContextPath () + "</h1>");
List news = newsEntityFacade.findAll();
for (Iterator it = news.iterator(); it.hasNext();) {
NewsEntity elem = (NewsEntity) it.next();
out.println(" <b>"+elem.getTitle()+" </b><br />");
out.println(elem.getBody()+"<br /> ");
}
out.println("<a href='PostMessage'>Add new message</a>");
out.println("</body>");
注: 以前のバージョンの IDE を使用している場合は、コードのコメント解除が必要になることがあります。
- インポートを修正 (Ctrl-Shift-I、Mac の場合は ⌘-Shift-I) して変更内容を保存します。
インポート文を生成するときは、java.util ライブラリをインポートします。
PostMessage サーブレットの作成
この課題では、メッセージの送信に使用される PostMessage サーブレットを作成します。注釈を使用して、作成した JMS リソースを直接このサーブレットに注入します。このとき、変数名と、この JMS リソースがマッピングされる名前を指定します。次に、JMS メッセージを送信するためのコードと、メッセージを追加するための HTML 形式のコードを追加します。
- Web モジュールプロジェクトを右クリックし、「新規」>「サーブレット」を選択します。
- 「クラス名」に「PostMessage」と入力します。
- 「パッケージ名」に「web」と入力します。「完了」をクリックします。
「完了」をクリックすると、 PostMessage.java というクラスがソースエディタに表示されます。
- ソースエディタで、注釈を使用して ConnectionFactory リソースおよび Queue リソースを注入します。これには、次のフィールド宣言を追加します。
@WebServlet(name="PostMessage", urlPatterns={"/PostMessage"})
public class PostMessage extends HttpServlet {
@Resource(mappedName="jms/NewMessageFactory")
private ConnectionFactory connectionFactory;
@Resource(mappedName="jms/NewMessage")
private Queue queue;
- インポートを修正して javax.jms ライブラリをインポートします。
注: IDE のオプションに javax.jms がない場合は、リポジトリから適切なアーティファクトを検索できます。これには、private ConnectionFactory connectionFactory; の横のマージン内にある提案アイコンをクリックし、「Maven リポジトリで依存リソースを検索」を選択します。
「Maven リポジトリで検索」ダイアログを使用して、ConnectionFactory を含む javaee-api-6.0 アーティファクトを検索できます。
- JMS メッセージを送信するための次のコードを processRequest メソッドに追加します。
response.setContentType("text/html;charset=UTF-8");
// Add the following code to send the JMS message
String title=request.getParameter("title");
String body=request.getParameter("body");
if ((title!=null) && (body!=null)) {
try {
Connection connection = connectionFactory.createConnection();
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
MessageProducer messageProducer = session.createProducer(queue);
ObjectMessage message = session.createObjectMessage();
// here we create NewsEntity, that will be sent in JMS message
NewsEntity e = new NewsEntity();
e.setTitle(title);
e.setBody(body);
message.setObject(e);
messageProducer.send(message);
messageProducer.close();
connection.close();
response.sendRedirect("ListNews");
} catch (JMSException ex) {
ex.printStackTrace();
}
}
- メッセージを追加する Web フォームのために、次のコード (ボールド部分) を追加します。
out.println("Servlet PostMessage at " + request.getContextPath() + "</h1>");
// The following code adds the form to the web page
out.println("<form>");
out.println("Title: <input type='text' name='title'><br/>");
out.println("Message: <textarea name='body'></textarea><br/>");
out.println("<input type='submit'><br/>");
out.println("</form>");
out.println("</body>");
注: 以前のバージョンの IDE を使用している場合は、コードのコメント解除が必要になることがあります。
- インポートを修正して変更内容を保存します。
注: Connection、ConnectionFactory、Session、および Queue に対し、javax.jms ライブラリをインポートします。
Maven を使用したアプリケーションの構築
アプリケーションのコーディングが完了したので、Maven を使用してエンタープライズアプリケーションを構築できます。この節では、EAR アーカイブ内のプロジェクトを構築およびパッケージ化します。EAR アーカイブには、EJB JAR アーカイブおよび WAR アーカイブが含まれます。EAR アーカイブを作成したあと、このアーカイブをターゲットサーバーに配備できます。
プロジェクト依存リソースの処理
この課題では、Web プロジェクトの POM (pom.xml) を調べて、パッケージ化の際に不要なアーティファクトが WAR に含まれないように POM を修正します。
各 Maven プロジェクトには、アーカイブの詳細な内容を含む pom.xml ファイルが含まれます。プロジェクトによって必要とされるすべての外部ライブラリは、POM 内に依存リソースとして一覧表示されます。POM を修正して、アーカイブをパッケージ化するときに含める必要がある依存リソースや除外すべき依存リソースを指定できます。
このアプリケーションでは、EJB JAR アーカイブおよび WAR アーカイブが、EAR アーカイブにパッケージ化されます。MavenEnterpriseApp-ear プロジェクトの pom.xml ファイルを見ると、EJB および WAR が依存リソースとして宣言されていることがわかります。
Web プロジェクトの pom.xml を見ると、EJB アーカイブが依存リソースとして宣言され、スコープが provided として指定されていることを確認できます。アーティファクトのスコープ要素の値が provided である場合、そのアーティファクトはパッケージ化の際に含まれません。この Web プロジェクトには依存リソースとして EJB アーカイブが必要ですが、このアプリケーションでは EJB アーカイブが EAR アーカイブの一部として使用可能になり、提供されるため、パッケージ化の際に EJB アーカイブを WAR に含めないようにする必要があります。
pom.xml を右クリックして「依存リソースグラフを表示」を選択すると、プロジェクトの依存関係を視覚的に確認できます。アーティファクト上にカーソルを置くと、このアーティファクトに関する詳細を示すツールチップが表示されます。
次の手順を実行して、Web プロジェクトの POM を修正し、javaee-api アーティファクトに対する依存関係に scope 要素を追加します。
- Web プロジェクトの下の「プロジェクトファイル」ノードを展開します。
- pom.xml をダブルクリックし、エディタでこのファイルを開きます。
- POM を編集し、次の <scope>provided</scope> 要素を追加することで、javaee-api アーティファクトに対する依存関係を修正します。
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>6.0</version>
<type>jar</type>
<scope>provided</scope>
</dependency>
POM エディタでコード補完を使用すると、ファイルの編集に役立ちます。
依存リソースの提供を宣言することで、WAR アーカイブの構築時、アーティファクトが Maven によってパッケージ化されなくなります。
注: NetBeans IDE 6.9 を使用している場合は、pom.xml を修正して、EJB アーカイブに対する依存関係にも <scope>provided</scope> 要素を追加する必要があります。
<dependency>
<groupId>com.mycompany</groupId>
<artifactId>MavenEnterpriseApp-ejb</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
- 変更を保存します。
依存関係で構築
Maven の構築フレームワークでは、特定の段階を経て処理されます。各段階には 1 つまたは複数のゴールがあり、さまざまな Maven プラグインを使用するように構成できます。「依存関係で構築」メニュー項目は、Maven の構築ライフサイクルの「インストール」段階にマップされ、Reactor プラグインを使用するように構成されています。ポップアップメニューから「依存関係で構築」を選択すると、アプリケーション、および必要とされるすべての依存関係が構築され、構築アーティファクトがローカルリポジトリにコピーされます。
プロジェクトの「プロパティー」ダイアログの「アクション」パネルでは、Maven の各段階とゴールが各メニューアクションにどのようにマップされるかを修正できます。
EAR アーカイブを構築するには、次の手順に従います。
- MavenEnterpriseApp-ear プロジェクトノードを右クリックし、「依存関係で構築」を選択します。
リアクタプラグインを使用して EAR プロジェクトを構築すると、EAR プロジェクトが構築される前に、EAR プロジェクトの依存リソースであるサブプロジェクトが構築されます。出力ウィンドウに、構築の順序が表示されます。
出力ウィンドウには、構築の結果も表示されます。
EAR プロジェクトを構築したあとに、「ファイル」ウィンドウの EAR プロジェクトノードの下の target ディレクトリ内に最終的な EAR アーカイブを表示できます。
デフォルトのアーティファクト名である com.mycompany を使用した場合は、Maven リポジトリブラウザを使用して、ローカルリポジトリ内の com.mycompany を展開し、構築アーティファクトを表示できます。
Maven プロジェクトの構築の詳細については、maven.apache.org で、「Maven - Introduction to the Build Lifecycle」を参照してください。
アプリケーションの配備と実行
この節では、EAR アーカイブをサーバーに配備するための 2 つの方法について説明します。アプリケーションを GlassFish サーバーに配備するには、IDE のメニューアクションを使用するか、または GlassFish 管理コンソールの配備ツールを使用します。
IDE からのアプリケーションの配備と実行
この課題では、「実行」アクションを使用して EAR アーカイブを GlassFish サーバーに配備します。アプリケーションを配備したら、ブラウザでアプリケーションの ListNews ページを開き、メッセージを追加します。
- 「プロジェクト」ウィンドウで EAR プロジェクトノードを右クリックし、「実行」を選択します。
「実行」をクリックすると、IDE によってサーバー上に EAR アーカイブが配備され、JMS リソースが作成されます。IDE がデフォルトのプロジェクトインデックスページ (http://localhost:8080/MavenEnterpriseApp-web/) をブラウザで開きます。
- ブラウザで次の URL を開き、ListNews ページを表示します。
http://localhost:8080/MavenEnterpriseApp-web/ListNews
プロジェクトをはじめて実行するときは、データベースは空であり、メッセージは表示されません。

- 「新規メッセージを追加」をクリックします。
- PostMessage サーブレットのフォーム内に、メッセージを入力します。「クエリーを送信」をクリックします。
PostMessage サーブレットを使用してメッセージを追加すると、持続ストレージに書き込むためのメッセージ駆動型 Bean にそのメッセージが送信され、ListNews サーブレットが呼び出されて、データベース内のメッセージが表示されます。このメッセージサービスは非同期のため、ListNews によって取得されるデータベース内のメッセージリストには、新しいメッセージがまだ含まれていないことがよくあります。
GlassFish サーバーをターゲットサーバーとして指定した Maven プロジェクトでは、「保存時にコンパイル」と「保存時に配備」がデフォルトで有効になっています。たとえば、サーブレットを変更して保存した場合は、アプリケーションを再配備しなくても、ブラウザでサーブレットを再読み込みして変更内容を表示できます。
NetBeans IDE 7.0 を使用する場合の注意事項
NetBeans IDE 7.0 では、以下の手順を実行して、「実行」アクションにマップされている Maven ゴールを変更する必要があります。アクションの修正後は、「実行」アクションを使用して、EAR をサーバーに配備できるようになります。「実行」アクションを選択すると、「配備サーバーを選択」ダイアログで GlassFish サーバーを選択するように求められる場合があります。
- 「プロジェクト」ウィンドウで EAR プロジェクトノードを右クリックし、「プロパティー」を選択します。
- 「プロパティー」ウィンドウの左側パネルのカテゴリリストから、「アクション」を選択します。
- 右側パネルのアクションリストから、「プロジェクトの実行」を選択します。
- 「ゴールを実行」テキストフィールドで、「package」ゴールを削除し、「install」と入力します。「了解」をクリックします。

GlassFish 管理コンソールからの配備
この課題では、GlassFish 管理コンソールの配備ツールを使用して EAR アーカイブを配備します。
- 「サービス」ウィンドウで「サーバー」ノードを展開します。
- GlassFish サーバーを起動します。
- GlassFish サーバーのノードを右クリックし、「管理コンソールを表示」を選択して、ブラウザ上で GlassFish 管理コンソールを開きます。
- 管理コンソールの左の区画で、アプリケーションノードをクリックします。
- 管理コンソールの主区画で、「配備」ボタンをクリックします。
- 「参照」をクリックし、エンタープライズアプリケーションの EAR アーカイブを特定します。
ローカルシステムでは、EAR アーカイブはエンタープライズアプリケーションディレクトリ内の target ディレクトリ内に置かれています。
- 「OK」をクリックします。
「OK」をクリックすると、GlassFish 配備ツールにより、アプリケーションが配備されます。
注: GlassFish 管理コンソールの配備ツールを使用してアプリケーションを配備する場合、アプリケーションで必要とされるリソースが存在しない場合はそれらを手動で作成する必要があります。
ソリューションプロジェクトのダウンロード
次の方法で、このチュートリアルにソリューションをプロジェクトとしてダウンロードできます。
関連項目
NetBeans IDE を使用した Java EE アプリケーションの開発方法についての詳細は、次のリソースを参照してください。
エンタープライズ Bean の使用方法については、「Java EE 6 チュートリアル」を参照してください。
nbj2ee メーリングリストに登録する ことによって、NetBeans IDE Java EE 開発機能に関するご意見やご提案を送信したり、サポートを受けたり、最新の開発情報を入手したりできます。