たなかこういちの資料室

システム開発に携わる筆者があれこれ試したことや学んだことについてのまとめ

Tomcat+JOTMの設定手順

1. JOTMを下記サイトの「Downloads」ページよりダウンロードします。
 
 
2. JOTMのパッケージに同梱されているlibサブディレクトリ内の全ての.jarファイルを、Tomcatの$CATALINA_HOME/common/libにコピーします。
 
3. 必要なJDBCドライバの.jarファイルも$CATALINA_HOME/common/libにコピーします。
 
4. Tomcatのserver.xmlの<GlobalNamingResources>要素内に、下記の例に倣って<Resource>子要素を追加してください。
 
-----(ここから)-----
<Resource
    name="jdbc/Xxxx"
    type="javax.sql.DataSource"
    auth="Container"
    factory="org.objectweb.jotm.datasource.DataSourceFactory"
    driverClassName="com.mysql.jdbc.Driver"
    url="jdbc:mysql://localhost:3306/test"
    username="xxxx"
    password="xxxx"
/>
<Resource
    name="UserTransaction"
    type="javax.transaction.UserTransaction"
    auth="Container"
    factory="org.objectweb.jotm.UserTransactionFactory"
    jotm.timeout="60"
/>
-----(ここまで)-----
 
5. 対象アプリに関する<Context>要素に、下記例に倣って<ResourceLink>子要素を追加してください。
 
-----(ここから)-----
<ResourceLink name="jdbc/Xxxx" global="jdbc/Xxxx"
    type="javax.sql.DataSource"/>
<ResourceLink name="UserTransaction" global="UserTransaction"/>
-----(ここまで)-----
 
※nameとglobalは、特に理由が無いなら同一としておくのが無難です。
 
6. 次のようなコードでUserTransactionの取得を実行したときに、示すような例外が発生した場合、おそらくWebアプリケーションのWEB-INF/libにJOTM以外のJTAの実装コードが含まれています。典型的には"geronimo-jta_1.1_spec-X.X.X.jar"が疑われます。その.jarを除去してください。
 
【コード】
-----(ここから)-----
Context ctx = new InitialContext();
UserTransaction tx =
    (UserTransaction)ctx.lookup("java:comp/UserTransaction");
-----(ここまで)-----
 
【例外】
-----(ここから)-----
java.lang.ClassCastException: org.objectweb.jotm.Current cannot be cast to javax.transaction.UserTransaction
-----(ここまで)-----
 
備考
 
- ここには<GlobalNamingResources>に<Resource>子要素を記述する方法の場合を示しましたが、<Context>要素内に<Resource>子要素を記述する方法でも同様です。
 
 
- ここに示した手順はTomcat 5.5+JOTM 2.1.9で実績があります。
 
参考文献