Jettyの起動まとめ:JNDIからDataSourceを取得

今回は、JettyでJNDIを使ってDataSourceを取得します。
Tomcatの場合は、JNDIを使用する場合にserver.xml(もしくはcontext.xml)に<resource>によってDataSourceを定義し、そしてweb.xmlから<resource-ref>で参照します。
図にするとこんな感じです。
TomcatのJNDI定義
Jettyの場合も大体は同じで、Tomcatでいうserver.xmlの代わりに、jetty用のconfig.xmlに記述すればよいです。web.xmlからの参照の仕方が同じなのはJ2EEの仕様だから、どのアプリケーションサーバーを使っても代わりません。
jettyのJNDI定義

サンプル

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アプリケーションとして配布するのも可能かと思います。

サンプルプログラム

https://app.box.com/s/vc1aot4mqva4968v6m09pnu4tmvmsrjd

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください