Seamアプリケーション開発のためのJBoss ToolsのセットアップはじめにJavaエンタープライズ開発の世界では、フレームワークやソリューションが次々に登場しています。しかし、Microsoft系の開発環境とは違って、フレームワークから開発ツールまでのエンドツーエンドのソリューションを提供しているものはごく少数です。JBossは、Java世界でこの試みに取り組んでいる数少ない例の1つで、次のような主な開発コンポーネントのスムーズな統合を実現しています。
必要なもの
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コンポーネントが含まれています。
図1 RichFacesのスキン対応AJAXシャトルリストコンポーネント。RichFacesの典型的な追加/削除リストコントロールです。 ![]() 図2 RichFacesのスキン対応AJAXデータテーブルコンポーネント。RichFacesはプロフェッショナルなデータグリッド/データテーブルコントロールを提供します。 ![]() FaceletsSeamはJSPページをサポートしますが、デフォルトのビュー技術はFaceletsです。FaceletsにはJSF開発で数多くの利点があります。主な利点としては、テンプレートのサポート、再利用可能なページコンポーネント、高速パフォーマンス、詳細なエラーレポートなどがあります。Seamの作成者であるGavin Kingは、すべてのSeamドキュメントでJSPよりもFaceletsを推奨しています。Faceletsのテンプレートサポートだけでも、Faceletsを選ぶ価値があります。Hibernate ValidatorsHibernate Validatorsは、小規模ながら非常に有用なプロジェクトです(その名称とは裏腹にHibernateライブラリそのものには結びつけられていません)。Hibernate Validatorsは基本的にJPAエンティティ用のバリデータを追加するものです(図3を参照)。具体的には、たとえば次のような新しいバリデータを指定できます。
図3 JBoss ToolsでのJPAエンティティのコーディングとHibernate Validatorsの使用。Hibernate Validatorsは基本的にJPAエンティティ用のバリデータを追加するものです。 ![]() <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>
JBoss EJB 3.0 Application ServerSeamは初期リリースでは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 ToolsJBoss Toolsは基本的に、上述のソフトウェアスタックに基づくSeamアプリケーションの開発を簡便化するためのEclipseプラグインスイートです。JBoss Toolsには、新しいSeamプロジェクトとそのサブコンポーネント(たとえば対話や、データベースからのエンティティなど)の作成に関する各種のウィザードと、JSF Webページ開発用のグラフィカルエディタが含まれています(図4を参照)。なお、デフォルトのJBoss ToolsインストールにはStruts開発用のプラグインも含まれています。大部分のJSP JavaショップでStrutsが定着していることを考えれば、これは非常に有益な措置です。 JBoss Toolsのセットアップ私の経験から言うと、JBoss Toolsのプラグインセットのインストール作業はプラットフォームによってかなり異なります(PermGen設定によって生じる重大なEclipseエラーについては、「補足説明2 PermGen設定とJBoss Tools」を参照)。JBoss Toolsの「All Plugins」のダウンロードを行ったところ、Windows XPマシンではうまくいきました。しかし、同じバンドルのLinuxバージョンでは、まったく違った結果になりました。依存関係の欠如にかかわるエラーのせいで、大部分の機能が登録されなかったのです(図5を参照)。後でわかったことですが、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」ファイルを追加しました。下に例を示しておきます。
-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に引き上げ、スタックとヒープメモリも最大限まで使用するようにしました。具体的な設定は次のとおりです。
最初のSeamプロジェクトの作成新しいSeamプロジェクトを作成するためには、New Seam Web Projectウィザードを起動する必要があります(図6を参照)。これは少し紛らわしい名前です。というのも、このプロジェクトにはWeb部分だけでなく、EJB、EARコンフィグレーション、および単体テストをホストするために必要なプロジェクトもすべて含まれるからです。図6 New Seam Web Projectウィザード。新しいSeamプロジェクトを作成するためには、このウィザードを起動する必要があります。 ![]() 著者注
プロジェクト名にダッシュ(-)を使用しないでください(たとえば「devx-seam」などは不可)。私はダッシュを使用してデプロイ例外を受け取りました。そのため、${PROJECT_ROOT}/resources/<project name>-ds.xmlファイルを開き、Entity Managerのデフォルト名を変更しなければなりませんでした。
最初のプロジェクトを作成する前に、いくつかの準備ステップを実行しなければなりません。最初のステップは、使用するアプリケーション/Webサーバー(ここではJBoss)のための新しいランタイムを作成することです(図7を参照)。次に、このランタイムを使用して、実際のサーバーのコンフィグレーションを作成する必要があります(図8を参照)。JMXコンソールにアクセスするためには、管理者のユーザー名/パスワードが必要になります(JBossでのデフォルトはいずれも「admin」です)。 ウィザードは新しいSeamランタイムの作成も求めてきますが、これはSeamライブラリのローカルインストールを指します(図9を参照)。意外なことに、このランタイムはJBoss Toolsの基本バージョンに含まれていません。私の場合、Seam 1.2.1とJBoss 4.2.2の組み合わせでデプロイの問題があったので、最新のSeam 2.0.1ランタイムで大部分のテストを行いました。 これが終われば、プロジェクトの初期セットアップが完了します(図10を参照)。 図9 New Seam Runtimeウィザード。 ![]() 図10 新しいSeam Web プロジェクトのセットアップの完了。プロジェクトの初期セットアップは、このようになるはずです。 ![]() 次のステップは、開発データベースの実際の接続の詳細を指定することです(図12を参照)。 図12 データベース接続の詳細のセットアップ。開発データベースの実際の接続の詳細を指定する必要があります。 ![]() 新しい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エンティティが自動的が生成されます。 ![]() 幸いなことに、このような複雑なデータベーススキーマに対しては、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 このような懸念事項はありますが、それもSeamが個々のJPAエンティティについて、ナビゲーションと統合的な検証機能を備えた一連の完璧な検索/編集ページを生成してくれることを思えばどうということはありません。後はHTMLに若干の操作を行って、レイアウトを修正し、デフォルトのラベルをもっとユーザーフレンドリーなものに置き換えるだけで済みます。 もう1つ付け加えると、デフォルトのFaceletsテンプレート(WebContent/layout/template.xhtml)を修正して、生成された各ページへのデフォルトのリンクの表示方法を変更することができます(図14を参照)。 新しい対話の作成単純に各JPAエンティティについてのページを自動生成する代わりに、独自のSeam対話(複数のページにわたるが単一のバッキングJSF beanで表現されるWebページフロー)を作成することも可能です。そのためには、New Seam Conversationウィザードを起動して、デフォルト設定を指定する必要があります(図15を参照)。このウィザードは基本的なJSFバッキングbeanのほか、初期スタートページを生成するので、そこからカスタマイズすることができます(図16を参照)。ただし、そのページは常にルートwebフォルダに置かれるので、大規模なアプリケーションでは、モジュールごとのサブフォルダに手動で移動する必要があるかもしれません。 図15 New Seam Conversationウィザード。New Seam Conversationウィザードを起動して、デフォルト設定を指定することにより、独自のSeam対話を作成します。 ![]() まとめ私の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年の経験がある。
関連記事 関連テーマ 最新トップニュース
|
|