japan.internet.comThe Internet & IT Network
RSS
  • ニュース
  • コラム
  • リサーチ
  • ヘッドライン
  • 特集
  • ブログ
  • プレスリリース
  • 専門チャンネル
  • イベント
  • ランキング
  • ニュースメール
2009年7月4日
文字サイズ文字サイズ小文字サイズ中文字サイズ大
デベロッパー コラム2008年6月24日 10:00
DevX
DevX japan.internet.com 編集部(japan.internet.com)メールホームrss
米国 WebMediaBrands が運営する、
企業向けアプリケーションの開発者向けの技術情報/サービスサイト。

Seamアプリケーション開発のためのJBoss Toolsのセットアップ

海外海外internet.com発の記事

はじめに

 Javaエンタープライズ開発の世界では、フレームワークやソリューションが次々に登場しています。しかし、Microsoft系の開発環境とは違って、フレームワークから開発ツールまでのエンドツーエンドのソリューションを提供しているものはごく少数です。JBossは、Java世界でこの試みに取り組んでいる数少ない例の1つで、次のような主な開発コンポーネントのスムーズな統合を実現しています。

  • JBoss Tools
  • Seam Webフレームワーク
  • JBoss EJB 3.0 Application Server
  • RichFaces JavaServer Faces(JSF)コンポーネントライブラリ
  • Facelets
  • Hibernate Validators
 これらのコンポーネントによってJBoss Web開発スタックが形成されています。本稿では、これらのコンポーネントを1つずつ説明してから、Seamアプリケーションを開発するためにJBoss Tools環境をセットアップする方法を示します。

必要なもの

Seam Webフレームワーク

 Seamは、JSFとEJB 3.0の世界をつなぐ接着剤となるもので(「補足説明1 SeamとWeb Beans」を参照)、EJBをマネージドbeanとして動作できるようにします(これにより、JPAや依存性注入といったEJB 3.0の機能のすべてに直接アクセスできます)。また、Seamは対話(conversation)という新しいコンテキストも提供します。これにより、複数のWebページにまたがる典型的なユースケースを1つの論理単位に簡単に結びつけることができます(そのため、現在のユーザープロセスを追跡するためにセッションコンテキストを操作しなくて済みます)。

補足説明1 SeamとWeb Beans(JSR 299)
 Seamは登場当初から好意的に受け入れられ、JSFとEJB 3.0を1つのシームレスな開発モデルにまとめ上げるという性質から、Java Enterprise Edition標準の一部になるべきだとの提案が出されました。もともとの目標は、Seamのアイデアを単にJava EEに持ち込むことだったのですが、JBossの外部のメンバーがこのJSRに参加するようになり、広がりを見せています。おそらく、Google Guice依存性注入フレームワークを支持している人たちも参加していると思われます。Web Beans仕様の初期のドラフトは、JCPのサイトまたはGavin Kingのブログ投稿から入手できます。
 リリースされた後の現在は、Java EEプラットフォームでのJSF/EJB 3.0開発の標準フレームワークになるのを待っている状態です。しかし、SeamはEJB 3.0に依存しており、そのEJB 3.0はSpringとの競合でまだ広く採用されていないという事情から、確実にそうなるとは断言できません。

RichFaces JSFコンポーネントライブラリ

 RichFacesは、ページ全体をリフレッシュしなくても通常のJSFポストバックサイクルを実行できるようにする完全AJAX対応のJSFコンポーネントライブラリです。これにより、WebアプリケーションがそのままAJAX対応になります。追加のJavaScriptコーディングは必要はありません。つまり、RichFacesは最小限の手間で見栄えのよいWeb 2.0アプリケーションを作成できるように設計されているのです。

 RichFacesには次のようなAJAX対応JSFコンポーネントが含まれています。

  • メニュー(コンテキスト、ドロップダウンなど)
  • ツリーコントロール
  • グラフィックパネル(Javaのグラフィック機能を使ってイメージを動的に描画できる)
  • タブパネル
  • 日付入力カレンダー
  • 数値入力スライダおよびスピナーコントロール
  • 典型的な追加/削除リストコントロール(図1を参照)
  • グラフィカル効果(フェード、折りたたみ、スクイッシュなど)
  • プロフェッショナルなデータグリッド/データテーブルコントロール(図2を参照)
 RichFacesのテーブル関連の機能の詳細については、オンラインデモを見てから、詳しいマニュアルを読んでください。

図1 RichFacesのスキン対応AJAXシャトルリストコンポーネント。RichFacesの典型的な追加/削除リストコントロールです。
図1 RichFacesのスキン対応AJAXシャトルリストコンポーネント。RichFacesの典型的な追加/削除リストコントロールです。
図2 RichFacesのスキン対応AJAXデータテーブルコンポーネント。RichFacesはプロフェッショナルなデータグリッド/データテーブルコントロールを提供します。
図2 RichFacesのスキン対応AJAXデータテーブルコンポーネント。RichFacesはプロフェッショナルなデータグリッド/データテーブルコントロールを提供します。

Facelets

 SeamはJSPページをサポートしますが、デフォルトのビュー技術はFaceletsです。FaceletsにはJSF開発で数多くの利点があります。主な利点としては、テンプレートのサポート、再利用可能なページコンポーネント、高速パフォーマンス、詳細なエラーレポートなどがあります。Seamの作成者であるGavin Kingは、すべてのSeamドキュメントでJSPよりもFaceletsを推奨しています。Faceletsのテンプレートサポートだけでも、Faceletsを選ぶ価値があります。

Hibernate Validators

 Hibernate Validatorsは、小規模ながら非常に有用なプロジェクトです(その名称とは裏腹にHibernateライブラリそのものには結びつけられていません)。Hibernate Validatorsは基本的にJPAエンティティ用のバリデータを追加するものです(図3を参照)。具体的には、たとえば次のような新しいバリデータを指定できます。

  • @Length(min/max)
  • @Max(value=)
  • @Min(value=)
  • @NotNull
  • @NotEmpty(文字列用)
  • @Pastと@Future(日付用)
  • @Pattern(正規表現ベースの検証用)
  • @Range(min=,max=)
 詳細については、Hibernate Validatorsのマニュアルを参照してください。

図3 JBoss ToolsでのJPAエンティティのコーディングとHibernate Validatorsの使用。Hibernate Validatorsは基本的にJPAエンティティ用のバリデータを追加するものです。
図3 JBoss ToolsでのJPAエンティティのコーディングとHibernate Validatorsの使用。Hibernate Validatorsは基本的にJPAエンティティ用のバリデータを追加するものです。
 Hibernate ValidatorsはSeamランタイムに含まれているので、新しいSeam Webプロジェクトのclasspathに自動的に追加されます。コードの中でHibernate Validatorsを使用し、それらをSeamとなめらかに統合するためには、次の例のように組み込みSeamタグ<s:validateAll>を使用する必要があります。

<h:form>
    <div>
        <h:messages/>
    </div>
    <s:validateAll>
        <div>
            Country:
            <h:inputText value="#{location.country}" required="true"/>
        </div>
        <div>
            Zip code:
            <h:inputText value="#{location.zip}" required="true"/>
        </div>
        <div>
            <h:commandButton/>
        </div>
    </s:validateAll>
</h:form>
 Seamにおけるフォーム検証の詳細については、フォーム検証のチュートリアルを参照してください。

JBoss EJB 3.0 Application Server

 Seamは初期リリースではJBoss Seamと呼ばれており、JBoss Application Server(AS)と密接に結びつけられていました。しかし、SeamチームはSeamがJBossプラットフォームの枠外にも普及することを望んでいたので、名称を単なるSeamに変え、非JBossサイトとしてseamframework.orgを作成しました。

 とはいえ、SeamはJBoss ASと最も相性がよく、JBoss ASはSeamアプリケーションの開発で最もよく使用される環境です。私はSeamアプリケーションをGlassfishにデプロイできましたが、多くのコンフィグレーションが必要でした(とりわけ、「web.xml」ファイルで、すべてのEJB JSFマネージドbeanを手動でEJBリファレンスとして登録しなければなりませんでした)。

 JBoss AS上でSeam 2.0.1を使用してアプリケーションを開発するためには、JBoss Application Server 4.2.2をダウンロードする必要があります。意外なことに、デフォルトバージョンであるSeam 1.2.1は、このバージョンのJBoss ASとはあまり相性がよくないようです(私が試したときには、Apache MyFacesに関連するデプロイエラーが発生しました)。これはおそらく、バージョン4.2以降のJBoss ASはSunのJSFリファレンス実装を使用し、停滞しているApache MyFaces実装を含めるのをやめたからでしょう。

JBoss Tools

 JBoss Toolsは基本的に、上述のソフトウェアスタックに基づくSeamアプリケーションの開発を簡便化するためのEclipseプラグインスイートです。JBoss Toolsには、新しいSeamプロジェクトとそのサブコンポーネント(たとえば対話や、データベースからのエンティティなど)の作成に関する各種のウィザードと、JSF Webページ開発用のグラフィカルエディタが含まれています(図4を参照)。

 なお、デフォルトのJBoss ToolsインストールにはStruts開発用のプラグインも含まれています。大部分のJSP JavaショップでStrutsが定着していることを考えれば、これは非常に有益な措置です。

図4 JSF/Seam/RichFaces/Faceletsページを開発するためのビジュアルエディタ。JBoss ToolsにはJSF Webページ開発用のグラフィカルエディタがあります。
図4 JSF/Seam/RichFaces/Faceletsページを開発するためのビジュアルエディタ。JBoss ToolsにはJSF Webページ開発用のグラフィカルエディタがあります。

JBoss Toolsのセットアップ

 私の経験から言うと、JBoss Toolsのプラグインセットのインストール作業はプラットフォームによってかなり異なります(PermGen設定によって生じる重大なEclipseエラーについては、「補足説明2 PermGen設定とJBoss Tools」を参照)。JBoss Toolsの「All Plugins」のダウンロードを行ったところ、Windows XPマシンではうまくいきました。しかし、同じバンドルのLinuxバージョンでは、まったく違った結果になりました。依存関係の欠如にかかわるエラーのせいで、大部分の機能が登録されなかったのです(図5を参照)。

図5 Ubuntuで失敗したJBoss Toolsのデフォルトインストール。Ubuntuでは依存関係の欠如にかかわるエラーのせいで大部分の機能が登録されませんでした。
図5 Ubuntuで失敗したJBoss Toolsのデフォルトインストール。Ubuntuでは依存関係の欠如にかかわるエラーのせいで大部分の機能が登録されませんでした。
 後でわかったことですが、JBoss ToolsダウンロードサイトからJBoss XDoclet、Struts Tools、Seam Tools、RichFaces VPE Tools、およびjBPM Designerプラグインを個別にダウンロードする必要があったのです。JBossを所有しているのは世界で最も熱心なLinux後援者の1つであるRed Hatなのに、これはまったく意外なことです。

 これらのプラグインを単純にメインEclipseフォルダにデプロイすることもできますが、私は別の場所にデプロイし、自分のEclipse環境にリンクすることにしました。そこで、Eclipseの下に「links」というフォルダを作成し、そこにJBossプラグインのインストール先へのパスを記述した「jbosstools.link」ファイルを追加しました。下に例を示しておきます。

  • ファイル名 -- /home/jacek/Dev/Java/IDE/eclipse-3.3.1/eclipse/links/jbostools.link
  • 「jbosstools.link」ファイルの内容 -- path=/home/jacek/Dev/Java/IDE/JbossTools
 このやり方を採用する場合は、この新しいリンクを登録するために、-cleanスイッチを指定してEclipseを再起動する必要があります。

 JBoss Toolsプラグインのインストールが完了したら、[Help]→[Software Updates]→[Manage Configuration]を選択します。最初のノードを展開し、すべてのプラグインがうまく登録されていてエラーがないことを確認してください。

著者注
 JBoss/Red Hatは、すべてのプラグインをコンフィグレーション済みの状態で商業配布しており、サポートも提供しています。これはJBoss Developer Studioと呼ばれるもので、99ドルの年会費で利用できます。
補足説明2 PermGen設定とJBoss Tools
 実のところ、JBoss Toolsを使い始めた最初の数日間は極度の失望感に襲われたことを認めなければなりません。IDE全体がクラッシュしたり、5〜10分ごとにハングしたものです。新しいプロジェクトをセットアップするといった単純なタスクでさえ何度となくやり直すはめになり、最終的にクラッシュしたり、特に理由もないのにCPUの使用率が限界に達したりすることも多々ありました。少し調べてみたところ、Eclipseの基本インストールに、SunのJVMで実行するとPermGenメモリを使い果たしてしまうという問題があることがわかりました(おそらく開発者の多くはSunのJVMを使用していると思うのですが…)。この問題が、JBoss Toolsプラグインの複雑さのおかげで顕著に出てきたというだけの話でした。
 そこで私は、自分のUbuntuマシンのデフォルトの「eclipse.ini」ファイルを修正して、PermGenメモリを256MBに引き上げ、スタックとヒープメモリも最大限まで使用するようにしました。具体的な設定は次のとおりです。
  • vmargs
  • Xms512m
  • Xmx1024m
  • XX:MaxPermSize=256m
 これでようやく事が順調に進み始め、JBoss Toolsが役に立つ開発ツールになりました。この設定を修正するまでは、1990年代末に仕事で使っていたPowerBuilder 7の苦い思い出を嫌でも思い出さざるを得ませんでした(PowerBuilder 7は頻繁なGPFで作業時間を無駄にすることで悪名高く、現在にいたるまで、「史上最も不安定な開発ツール」の座を守り続けています)。

最初のSeamプロジェクトの作成

 新しいSeamプロジェクトを作成するためには、New Seam Web Projectウィザードを起動する必要があります(図6を参照)。これは少し紛らわしい名前です。というのも、このプロジェクトにはWeb部分だけでなく、EJB、EARコンフィグレーション、および単体テストをホストするために必要なプロジェクトもすべて含まれるからです。

図6 New Seam Web Projectウィザード。新しいSeamプロジェクトを作成するためには、このウィザードを起動する必要があります。
図6 New Seam Web Projectウィザード。新しいSeamプロジェクトを作成するためには、このウィザードを起動する必要があります。
著者注
 プロジェクト名にダッシュ(-)を使用しないでください(たとえば「devx-seam」などは不可)。私はダッシュを使用してデプロイ例外を受け取りました。そのため、${PROJECT_ROOT}/resources/<project name>-ds.xmlファイルを開き、Entity Managerのデフォルト名を変更しなければなりませんでした。
 最初のプロジェクトを作成する前に、いくつかの準備ステップを実行しなければなりません。最初のステップは、使用するアプリケーション/Webサーバー(ここではJBoss)のための新しいランタイムを作成することです(図7を参照)。

 次に、このランタイムを使用して、実際のサーバーのコンフィグレーションを作成する必要があります(図8を参照)。JMXコンソールにアクセスするためには、管理者のユーザー名/パスワードが必要になります(JBossでのデフォルトはいずれも「admin」です)。

図7 New JBoss Runtimeウィザード。このウィザードで、使用するアプリケーション/Webサーバーのための新しいランタイムを作成します。
図7 New JBoss Runtimeウィザード。このウィザードで、使用するアプリケーション/Webサーバーのための新しいランタイムを作成します。
図8 New JBoss Serverウィザード。すでに指定したランタイムを使用して、実際のサーバーのコンフィグレーションを作成する必要があります。
図8 New JBoss Serverウィザード。すでに指定したランタイムを使用して、実際のサーバーのコンフィグレーションを作成する必要があります。
 ウィザードは新しいSeamランタイムの作成も求めてきますが、これはSeamライブラリのローカルインストールを指します(図9を参照)。意外なことに、このランタイムはJBoss Toolsの基本バージョンに含まれていません。私の場合、Seam 1.2.1とJBoss 4.2.2の組み合わせでデプロイの問題があったので、最新のSeam 2.0.1ランタイムで大部分のテストを行いました。

 これが終われば、プロジェクトの初期セットアップが完了します(図10を参照)。

図9 New Seam Runtimeウィザード。
図9 New Seam Runtimeウィザード。
図10 新しいSeam Web プロジェクトのセットアップの完了。プロジェクトの初期セットアップは、このようになるはずです。
図10 新しいSeam Web プロジェクトのセットアップの完了。プロジェクトの初期セットアップは、このようになるはずです。
 しかし、Seamにはデータベースから新しいエンティティ(およびそれらのメンテナンスページ)を自動的に作成する機能があるので、プロジェクトのJPA Entity Managerのデータベース接続を定義する必要があります。この要件を満たすための最初のステップは、使用するデータベースドライバを定義することです(図11を参照)。目的のドライバをローカルにダウンロードしていることを確認してください(私の場合、これはMySQL JDBCドライバです)。

 次のステップは、開発データベースの実際の接続の詳細を指定することです(図12を参照)。

図11 データベースドライバのセットアップ。プロジェクトのJPA Entity Managerのデータベース接続を定義する必要があります。
図11 データベースドライバのセットアップ。プロジェクトのJPA Entity Managerのデータベース接続を定義する必要があります。
図12 データベース接続の詳細のセットアップ。開発データベースの実際の接続の詳細を指定する必要があります。
図12 データベース接続の詳細のセットアップ。開発データベースの実際の接続の詳細を指定する必要があります。
 この時点で基本プロジェクトが作成されているはずです。メインプロジェクトノードを右クリックし、[Run]→[Run on Server]を選択してプロジェクトをサーバーにデプロイし、Eclipse IDE内で統合ブラウザを開き、新しいWebアプリケーションの基本開始点であるログインページを表示してください。

 新しいSeamプロジェクトを作成するときには、プロジェクトのEJB部分にアプリケーションエラーが表示されることがあります。その場合は、ワークスペースをcleanして再コンパイルすることで、この問題を修正してください。

ログイン/認証ロジックの処理

 プロジェクトウィザードはログインを作成するだけでなく、ログインをルートパッケージ内のAuthenticator.javaというビジネスオブジェクトに接続します。Authenticator.java内にログインの検証をすべてコーディングし、成功か否かに応じてtrueまたはfalseを返してください。

@Name("authenticator")
''public class'' Authenticator
{
    @Logger Log log;
    
    @In Identity identity;
   
    ''public boolean'' authenticate()
    {
        log.info("authenticating #0", identity.getUsername());
        //write your authentication logic here,
        //return true if the authentication was
        //successful, false otherwise
        identity.addRole("admin");
        ''return true;''
    }
}

JPAエンティティの作成

 EclipseのProject Explorer内でプロジェクトノードを右クリックし、[New]→[Seam Generate Entities]メニューオプションを選択します。これにより、新しいウィザードが起動され、プロジェクト作成時に定義した接続プロファイルを使ってJPAエンティティが自動的に生成されます(図13を参照)。さらに、各エンティティについて基本的なメンテナンスWebページも作成されるので、反復的な作業にかかる時間が大いに節約されます。

図13 Generate Seam Entitiesウィザード。新しいウィザードにより、プロジェクト作成時に定義した接続プロファイルを使ってJPAエンティティが自動的が生成されます。
図13 Generate Seam Entitiesウィザード。新しいウィザードにより、プロジェクト作成時に定義した接続プロファイルを使ってJPAエンティティが自動的が生成されます。
 このウィザードは、この例のために作成した平凡なデータモデルでは申し分なく働くのですが、テーブルが何百もあるプロダクションデータベースで実行したところ、うまく働きませんでした。データベース内の全テーブルについて1つ1つエンティティの作成を試みているようで、どれを含めるかは指定できませんでした。しかし、エンティティクラスを前もって作成しておけば、関連するメンテナンスページの生成前にそれらを選択することができました。

 幸いなことに、このような複雑なデータベーススキーマに対しては、Eclipse IDE for Java EEに付属のDali JPAツールを使用して、エンティティを作成し、それらをSeamプロジェクトにインポートすることができました。とはいえ、デフォルトのアクションやメンテナンスWebページなど、生成された追加的なコードの一部は失われました。

 さらに、生成されたSeam JPAコードを手作業で操作する必要もありました。JPAエンティティ内に含まれている、疑わしい実スキーマ名を削除しなければなりませんでした。たとえば次のものを、

@Entity
@Table(name = "author", catalog = "devx")
''public class'' Author ''implements'' java.io.Serializable 
 次のような純粋なテーブルベースの注釈に置き換えることにしました。

@Entity
@Table(name = "author")
''public class'' Author ''implements'' java.io.Serializable 
 実際の注釈にデータベース名を含めることに関するロジックはよくわかりません。実のところ、これはJPA Entity Managerが使用するデータベース接続のプロパティなのです。したがって、それは実際のコードに属していないと思います。

 このような懸念事項はありますが、それもSeamが個々のJPAエンティティについて、ナビゲーションと統合的な検証機能を備えた一連の完璧な検索/編集ページを生成してくれることを思えばどうということはありません。後はHTMLに若干の操作を行って、レイアウトを修正し、デフォルトのラベルをもっとユーザーフレンドリーなものに置き換えるだけで済みます。

 もう1つ付け加えると、デフォルトのFaceletsテンプレート(WebContent/layout/template.xhtml)を修正して、生成された各ページへのデフォルトのリンクの表示方法を変更することができます(図14を参照)。

図14 JPAエンティティに対して生成された検索/編集ページ。デフォルトのFaceletsテンプレート(WebContent/layout/template.xhtml)を修正できます。
図14 JPAエンティティに対して生成された検索/編集ページ。デフォルトのFaceletsテンプレート(WebContent/layout/template.xhtml)を修正できます。

新しい対話の作成

 単純に各JPAエンティティについてのページを自動生成する代わりに、独自のSeam対話(複数のページにわたるが単一のバッキングJSF beanで表現されるWebページフロー)を作成することも可能です。そのためには、New Seam Conversationウィザードを起動して、デフォルト設定を指定する必要があります(図15を参照)。

 このウィザードは基本的なJSFバッキングbeanのほか、初期スタートページを生成するので、そこからカスタマイズすることができます(図16を参照)。ただし、そのページは常にルートwebフォルダに置かれるので、大規模なアプリケーションでは、モジュールごとのサブフォルダに手動で移動する必要があるかもしれません。

図15 New Seam Conversationウィザード。New Seam Conversationウィザードを起動して、デフォルト設定を指定することにより、独自のSeam対話を作成します。
図15 New Seam Conversationウィザード。New Seam Conversationウィザードを起動して、デフォルト設定を指定することにより、独自のSeam対話を作成します。
図16 New Seam Conversationウィザードにより生成されるデフォルトのスタートページ。このウィザードは基本的なJSFバッキングbeanと初期スタートページを生成します。
図16 New Seam Conversationウィザードにより生成されるデフォルトのスタートページ。このウィザードは基本的なJSFバッキングbeanと初期スタートページを生成します。

まとめ

 私のJBoss Tools体験は最初からスムーズに事が運んだわけではありませんが(「補足説明2 PermGen設定とJBoss Tools」を参照)、ランタイム設定を修正した後は、何もかもずっとうまくいくようになりました。とりわけ、JPAエンティティからのエンティティ生成のサポート、RichFacesの統合Ajaxサポート、そしてSeam対話機能は、このようなツールとフレームワークの統合環境がどれだけ生産性の向上に寄与するかということを私に教えてくれました。最近のプロジェクトで、旧式のStrutsアクションの開発と手作業でのAjaxコーディングに数か月を費やした後だったため、この経験は一服の清涼剤となるものでした。

著者紹介

Jacek Furmankiewicz(Jacek Furmankiewicz)
Compuware Corporation of Canadaの上級開発者/設計者。UNIX、PowerBuilder、C#/Microsoft .NET、Java、PHP、Microsoft SQL Server、OracleなどでITの専門家として12年の経験がある。
Copyright 2009 Japan Internet.com K.K. All Rights Reserved.http://www.internet.com/