22149


Jersey 2.2を利用したアプリケーションをJetty 9.3 (9.3.7.v20160115)上で動かそうとしています。

データベース接続プールをアプリケーションからJNDI経由で取得できるようにするため、下記の内容を`$JETTY_HOME/webapps/app.xml`に設置しました。（同じディレクトリに`app.war`を設置しています。）

[code]

    <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>
    
[/code]

しかし、この状態でJettyを起動すると、`app.xml`内で指定した`BasicDataSource`が見つからずに`ClassNotFoundException`が発生してしまいます。

[code]

    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)
    
[/code]

アプリケーションの`pom.xml`には下記のように`commons-dbcp2`を依存先に含めています。

[code]

    <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>
    
[/code]

また、下記の結果からも依存ライブラリがwarに含まれていることを確認できます。

[code]

    % jar -tf app.war | grep commons-dbcp2
    WEB-INF/lib/commons-dbcp2-2.1.1.jar
    
[/code]

Jetty側でJNDIへの注入を行う場合、その中で必要となるクラスはアプリケーションのwarに含めるのではなく、別の場所へデプロイする必要があるのでしょうか？  
もしくはアプリケーションのwarに含まれたライブラリをコンテナ側に読ませるための設定が別途必要なのでしょうか？


CC BY-SA 3.0
2016-02-14T12:08:09.837
22070
2016-02-16T04:20:07.193
2249
question
java servlet
JNDIの設定を追加するとJetty起動時にClassNotFoundExceptionが発生する


commons-dbcpのライブラリは`$JETTY_HOME/lib/ext`に配置する必要があります。

Jettyに限らず、Tomcatなどのアプリケーションサーバは自身のロード後に各アプリケーションをロードします。データベース接続プールはJettyが管理するため、必要なクラスはJettyロード時に参照できる必要があります。

そのため、Jettyロード時に参照できる位置に必要なライブラリを配置する必要があります。


CC BY-SA 3.0
2016-02-16T04:20:07.193
22149
2016-02-16T04:20:07.193
10724
22070
answer