<< 2010/06/21 | Home | 2010/06/23 >>
PR: 転職    お墓    エコ    通販    結婚相談所    シルバー    質屋    葬式    漫画    エステサロン   

Tomcatで、JSF2 + Weld

TomcatでWeldを動かす時の注意点。

今回は、以下のバージョンを利用

Sun Java 1.6.0_20
apache-tomcat-6.0.26
weld-1.0.1-Final

Tomcatは普通にzip(Windows以外は、tar.gz)を落として解凍。binの下のstartupを実行し、http://localhost:8080をブラウザで見て、Tomcatのトップページが見えることを確認しておく。ここまでがうまく行かない時は、Weld以前の話なので、GoogleでTomcatのインストールに関する情報を参照して解決してください。

Weldも普通にzipを落として解凍。examples/build.propertiesを編集し、tomcat.home=のところに、tomcatの絶対パスを記述(例:tomcat.home=d:/work/apache-tomcat-6.0.26)。

number-guessを試しに動かしてみるため、examples/jsf/numberguessの下に行く。ant tomcat.packageを実行するとwarファイルが出来るはずだけど、Maven嫌いで、普段あまり使ってない人は、以下のような、一見親切だけど、Maven知らない人は途方に暮れるしかないメッセージで止まると思われる。

...
[java] [INFO] ------------------------------------------------------------------------
[java] [ERROR] BUILD ERROR
[java] [INFO] ------------------------------------------------------------------------
[java] [INFO] Failed to resolve artifact.
[java]
[java] Missing:
[java] ----------
[java] 1) javax.faces:jsf-api:jar:2.0.2-FCS
[java]
[java] Try downloading the file manually from the project website.
[java]
[java] Then, install it using the command:
[java] mvn install:install-file -DgroupId=javax.faces -DartifactId=jsf-api -Dversion=2.0.2-FCS -Dpackaging=jar -Dfile=/path/to/file
...

その場合は、あわてず騒がず、カレントディレクトリにあるpom.xmlを開いて、最後のところにリポジトリ定義を追加してやる。

  <repositories>
<repository>
<id>jboss-public-repository-group</id>
<name>JBoss Public Maven Repository Group</name>
<url>https://repository.jboss.org/nexus/content/groups/public/</url>
<releases>
<enabled>true</enabled>
<updatePolicy>never</updatePolicy>
</releases>
<snapshots>
<enabled>true</enabled>
<updatePolicy>never</updatePolicy>
</snapshots>
</repository>
</repositories>
</project>

これで、めでたくtargetの下に、weld-numberguess.warが出来るはず。これを、Tomcatのインストールディレクトリの、webappsの下に置いて、ちょっと待つと自動デプロイされる。Webブラウザで、http://localhost:8080/weld-numberguess/home.jsf を開けば数当てゲームが実行できる。

その他、留意点など。

基本的に、TomcatベースでEJBとかXAトランザクション無しで手軽にアプリケーションを作るなら、このnumberguessのwarファイルを参考にすれば良いが、私の方で気付いた留意点を幾つか。

ライブラリが古い。

Tomcatに入っているELのライブラリが古い。EL2が使えないと、あまりに悲しいので、入れ替えてしまうと良い。ただ、Tomcatにデプロイされる全アプリに影響するので、ご利用は計画的に。Tomcatのインストールディレクトリのlibの下に行き、el-api.jarを、el-api.ja0にリネーム。el-api-2.2.jarと、el-impl-2.2jarをダウンロードして、ここに置く。クラスローダ回りの、いやらしいエラーに悩むことになるので、個々のアプリケーションのwarファイルのlibには、EL関係のJARを置かないこと。numberguessにも、el-impl-2.1.2-b04.jarというのが入っているので消しておく。

weld-servlet-1.0.1-Final.jarが、slf4jのライブラリを抱え込んでいる。

weld-servlet-1.0.1-Final.jarがslf4jのライブラリを抱え込んでしまっている。なので、自分でslf4を入れてロギング実装を入れ替えることができない(何を考えているんだか...)。jarをほどいてslf4j関係のファイルを消してjarを作り直すか、承知の上でこのまま使う。

追記:組み込まれているのは、JDK14のLoggerアダプタなので、Tomcatインストールディレクトリのconfディレクトリにある、logging.propertiesの設定に従ってロギングされる。

追記:なお、Weldの設定にミスがある場合、Tomcatの起動時に以下のような簡単なエラーしかコンソールに出ない。

...
2010/06/22 18:00:26 org.apache.catalina.core.StandardContext start
致命的: Error listenerStart
2010/06/22 18:00:26 org.apache.catalina.core.StandardContext start
致命的: 以前のエラーのためにコンテキストの起動が失敗しました [/weld-numberguess]
...

この場合は、Tomcatのインストールディレクトリのlogsの下にあるlocalhostXXX.logというファイルを見てみると良い(これはWeldに限らないが)。以下は、Fooインターフェイスの実装クラスとして、FooImplとFooImpl2を用意した場合のエラー(実装が2つあって、どちらに決めて良いか分からないと言っている)。

...
致命的: クラス org.jboss.weld.environment.servlet.Listener のリスナインスタンスにコンテキスト初期化イベントを送信中の例外です
org.jboss.weld.exceptions.DeploymentException: WELD-001409 Injection point has ambiguous dependencies. Injection point: field org.jboss.weld.examples.numberguess.Game.foo; Qualifiers: [@javax.enterprise.inject.Default()]; Possible dependencies: [org.jboss.weld.bean-flat-ManagedBean-class org.jboss.weld.examples.numberguess.FooImpl, org.jboss.weld.bean-flat-ManagedBean-class org.jboss.weld.examples.numberguess.FooImpl2]
at org.jboss.weld.bootstrap.Validator.validateInjectionPoint(Validator.java:280)
at org.jboss.weld.bootstrap.Validator.validateBean(Validator.java:122)
at org.jboss.weld.bootstrap.Validator.validateRIBean(Validator.java:141)
...

追記2:nekopさんから、weld-servlet-int.jarの存在を教えていただきました。Weldのパッケージ内の、artifacts/weldの下にあります。通常のアプリケーション開発では、こちらを使うべきですね。

追記3:ELライブラリを入れ替える際は、web.xmlに、以下の指定が必要。

  <context-param>
    <param-name>com.sun.faces.expressionFactory</param-name>
    <param-value>com.sun.el.ExpressionFactoryImpl</param-value>
  </context-param>

このサイトの掲載内容は私自身の見解であり、必ずしもIBMの立場、戦略、意見を代表するものではありません。
日本アイ・ビー・エム 花井 志生 Since 1997.6.8