今回は、JettyでJNDIを使ってDataSourceを取得します。
Tomcatの場合は、JNDIを使用する場合にserver.xml(もしくはcontext.xml)に<resource>
によってDataSourceを定義し、そしてweb.xmlから<resource-ref>
で参照します。
図にするとこんな感じです。
Jettyの場合も大体は同じで、Tomcatでいうserver.xmlの代わりに、jetty用のconfig.xmlに記述すればよいです。web.xmlからの参照の仕方が同じなのはJ2EEの仕様だから、どのアプリケーションサーバーを使っても代わりません。
サンプル
JNDIを使うための設定
JNDIを使う場合は、必要最小限の3つのJARファイル(jetty-x.jar, jetty-util-x.jar, servert-api-x.jar)に加えて、lib/naming/jetty-naming-x.jarと、lib/plus/jetty-plus-x.jarが必要になります。
[XML設定の場合]
libフォルダに、namingフォルダとplusフォルダを配置します。さらにlibフォルダ配下にJDBCドライバのJARファイルを配置します。こんな感じです。
[myfolder]
+- config.xml
+- start.jar
|
+- [lib]
+- jetty-x.jar
+- jetty-util-x.jar
+- servlet-api-.x.jar
+- JDBCドライバのJARファイル
|
+-[naming]
| +- jetty-naming-x.jar
|
+-[plus]
+- jetty-plus-x.jar
実行時には、コマンドラインから、
java -jar start.jar config.xml
の形式で実行します。
今までにも説明してきましたが、start.jarから起動するとlibフォルダ配下のJARファイルをクラスパスに追加してくれるので楽です。
config.xmlに記述する点が2点あります。1つはconfigurationClassesの設定です。もう1つはTomcatと同じようなJNDIの定義です。configurationClassesはこんな感じで記述します。
<array id="plusConfig" type="java.lang.String">
<item>org.mortbay.jetty.webapp.WebInfConfiguration</item>
...中略...
<item>org.mortbay.jetty.webapp.TagLibConfiguration</item>
</array>
plusConfigというidはこの配列につけた名前なので何でもいいです。WebAppContextの設定時に参照するために名づけています。
<!-- Webアプリケーションの指定 -->
<set name="handler">
<new class="org.mortbay.jetty.webapp.WebAppContext">
...中略...
<!-- 先のplusConfigを参照 -->
<set name="configurationClasses"><ref id="plusConfig" /></set>
</new>
</set>
次にJNDIの定義とDataSourceの設定です。Tomcatの場合はCommons-DBCPが用意されていたのでDataSourceを用意する必要がなかったのですが、Jettyの場合はDataSourceは用意されていません。JDBCドライバ提供のDataSourceを使う必要があります。(なかったらCommons-DBCPを用意すれば汎用的に使用できます。サンプルにはCommons-DBCPでDataSource定義する例も書いてあります。)
このサンプルでは、HSQLDBのDataSourceを使用しています。
<!-- データソースの設定 -->
<new id="jnditest" class="org.mortbay.jetty.plus.naming.Resource">
<arg>jdbc/jnditest</arg>
<arg>
<!-- HSQLDB用のDataSource -->
<new class="org.hsqldb.jdbc.jdbcDataSource">
...中略...
</new>
</arg>
</new>
web.xmlからリソース参照します。
<resource-ref>
<res-ref-name>jdbc/jnditest</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
これでOKです。Servletなどのアプリケーションからは、以下のようなコードでDataSourceを取得できます。
InitialContext context = new InitialContext();
dataSource = (DataSource)context.lookup("java:comp/env/jdbc/jnditest");
config.xmlのサンプル
長くなりましたが、WebAppsフォルダを指定する場合でもまったく同じです。
サンプルプログラムでは、HSQLDB同梱で動作確認できるようにしてあります。Cドライブ直下に展開して、
java -jar start.jar jndi-onlywar.xml
(1つのWebアプリ)
java -jar start.jar jndi-webappsdir.xml
(WebAppsフォルダの指定)
で動作確認できます。
[Java設定の場合]
Javaから起動する場合は、config.xmlの定義のままにコードを記述するだけです。
ちょっとおやっと思うのが、ResourceはnewしてあげるだけでInitialContextに登録されているようです。
jdbcDataSource ds = new jdbcDataSource();
ds.setDatabase("jdbc:hsqldb:hsql://localhost/test");
ds.setUser("sa");
ds.setPassword("");
new Resource("jdbc/jnditest", ds);
(サンプルプログラムのJNDITestServerを参考にしてください)
まとめ
JettyからもJNDI経由でDataSourceを取得することができました。これによってDBを使うようなWebアプリケーションを大体動かせるようになります。
組み込みDBとともに組み込みWebアプリケーションとして配布するのも可能かと思います。