JNDIの設定を追加するとJetty起動時にClassNotFoundExceptionが発生する
Jersey 2.2を利用したアプリケーションをJetty 9.3 (9.3.7.v20160115)上で動かそうとしています。
データベース接続プールをアプリケーションからJNDI経由で取得できるようにするため、下記の内容を$JETTY_HOME/webapps/app.xml
に設置しました。(同じディレクトリにapp.war
を設置しています。)
<Configure class="org.eclipse.jetty.webapp.WebAppContext">
<Set name="contextPath">/</Set>
<Set name="war"><SystemProperty name="jetty.base"/>/webapps/app.war</Set>
<New id="datasource" class="org.eclipse.jetty.plus.jndi.Resource">
<Arg></Arg>
<Arg>jdbc/mysql</Arg>
<Arg>
<New class="org.apache.commons.dbcp2.BasicDataSource">
<Set name="driverClassName">com.mysql.jdbc.Driver</Set>
<Set name="url">jdbc:mysql://localhost:3306/testdb</Set>
<Set name="username">testuser</Set>
<Set name="password">testpw</Set>
</New>
</Arg>
</New>
</Configure>
しかし、この状態でJettyを起動すると、app.xml
内で指定したBasicDataSource
が見つからずにClassNotFoundException
が発生してしまいます。
2016-02-14 11:41:10.260:WARN:oejd.DeploymentManager:main: Unable to reach node goal: started
java.lang.ClassNotFoundException: org.apache.commons.dbcp2.BasicDataSource
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
...
at org.eclipse.jetty.start.Main.main(Main.java:75)
アプリケーションのpom.xml
には下記のようにcommons-dbcp2
を依存先に含めています。
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-dbcp2</artifactId>
<version>2.1.1</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.38</version>
</dependency>
また、下記の結果からも依存ライブラリがwarに含まれていることを確認できます。
% jar -tf app.war | grep commons-dbcp2
WEB-INF/lib/commons-dbcp2-2.1.1.jar
Jetty側でJNDIへの注入を行う場合、その中で必要となるクラスはアプリケーションのwarに含めるのではなく、別の場所へデプロイする必要があるのでしょうか?
もしくはアプリケーションのwarに含まれたライブラリをコンテナ側に読ませるための設定が別途必要なのでしょうか?