JSF2.0+JPA2.0+eclipse 構築編:JPAでの例外の解消(その3)

相変わらず例外の原因が分からず苦しんでいます。

前回、persistence.xmlに誤りがないことを確認しました。

今回は組み込みではなく、サーバ形式のGlassfishにWARをデプロイしても同じ現象が起きるかどうかを見てみたいと思います。

Glassfish 3.0.1 のインストール

GlassfishにはOracleが商用サポートしている版とオープンソース版があるようです。
今回はオープンソース版を利用します。

http://glassfish.java.net/ja/downloads/3.0.1-final.html
からフルプロファイルのZIPアーカイブファイルをダウンロードします。

余談ですが、よく考えずにフルプロファイルを使っていますがWebプロファイルでも充分だった気がします。
ダウンロードしたZIPは適当な場所に解凍しておきます。
これでインストールは完了。かんたん。

Glassfishを起動

ターミナル(Windowsならコマンドプロンプト)を開いて、Glassfishの起動コマンドのあるフォルダに移動します。
ZIPを解凍したら現れるフォルダからの相対パスは以下になります。

glassfish/bin

ここで以下のコマンドを実行。

./asadmin start-domain domain1

ターミナルは以下のような感じになります。

jabaraster-mac-book-air:bin jabaraster$ ./asadmin start-domain domain1
DAS の起動を待機しています ..........
起動したドメイン: domain1
ドメインの場所: /Users/jabaraster/Downloads/glassfishv3/glassfish/domains/domain1
ログファイル: /Users/jabaraster/Downloads/glassfishv3/glassfish/domains/domain1/logs/server.log
ドメインの管理ポート: 4848
コマンド start-domain は正常に実行されました。
jabaraster-mac-book-air:bin jabaraster$ 

バックグラウンドでプロセス上げるみたいですね。ターミナルに制御が戻ってきてます。

動作確認のために以下のURLにアクセスしてみましょう。
http://localhost:8080/

こんな↓画面が表示されました。OKのようですね。

WARの作成

さてデプロイするためのWARを作りましょう。
たぶん、eclipseプロジェクトのWebContent以下をjarコマンドで固めればうまくいくはずです。

jar cvf ../sandbox.war .

WARのデプロイ

デプロイは簡単で、glassfishのautodeployフォルダにWARを置くだけです。
autodeployフォルダは以下の場所にあります。

<GlassfishのZIPを解凍して現れるフォルダ>/glassfish/domains/domain1/autodeploy

さて結果はどうかな・・・なんかダメみたいです。
autodeployフォルダにsandbox.war_deployFailedというファイルが出来てます。読んで字のごとく、デプロイに失敗したみたいです。

失敗の原因を探る

sandbox.war_deployFailedにログが出てるのかな・・・と思いきや、中身は空でした。
ではserver.logを確認しましょう。
server.logは以下の場所にあります。

<GlassfishのZIPを解凍して現れるフォルダ>/glassfish/domains/domain1/logs

ログにはスタックトレースがだらだらと吐かれていますが、気になったのは以下の部分。

java.lang.RuntimeException: The persistence-context-ref-name [sandbox.bean.EmployeeService/em] in module [sandbox] resolves to a persistence unit called [pu] which is of type RESOURCE_LOCAL. Only persistence units with transaction type JTA can be used as a container managed entity manager. Please verify your application.
	at com.sun.enterprise.deployment.BundleDescriptor.findReferencedPUsViaPCRefs(BundleDescriptor.java:679)
	at com.sun.enterprise.deployment.WebBundleDescriptor.findReferencedPUs(WebBundleDescriptor.java:1038)
	at org.glassfish.persistence.jpa.JPADeployer.prepare(JPADeployer.java:103)
	at com.sun.enterprise.v3.server.ApplicationLifecycle.prepareModule(ApplicationLifecycle.java:644)
	at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:296)
...

どうやら「persistence.xmlのtransaction-typeがRESOURCE_LOCALになってるけどJTAしか使っちゃダメ!」と怒られているようです。

これは重要な手がかりかもしれません。

次回は

次回はpersistence.xmlのtransaction-typeを変えて実行してみます。
そのためにデータソースを登録しないといけないんですよね。これがめんどくさいからやってなかったんですが、避けられない状況なので仕方がありません。