Jetty JNDI resource fails: “java.lang.ClassNotFoun

2019-08-18 22:54发布

问题:

When I started the Jetty (over Gretty plugin) I get the CNF exception. When I run

gradlew :MyWebApplication:appRun -ds > g.log I see following configuration in debug:

    {
    "servletContainerId": "jetty9.3",
    "servletContainerDescription": "Jetty 9.3.25.v20180904",
    "httpEnabled": true,
    "httpPort": 8585,
    "serverConfigFile": "C:\\Users\\user\\eclipse-workspace\\WS\\jetty.xml",
    "logbackConfigFile": "C:\\Users\\user\\eclipse-workspace\\WS\\MyWebApp\\config\\logback.xml",
    "loggingLevel": "INFO",
    "consoleLogEnabled": true,
    "fileLogEnabled": true,
    "logFileName": "MyWebApp",
    "logDir": "C:\\Users\\user/logs",
    "baseDir": "C:\\Users\\user\\eclipse-workspace\\WS\\MyWebApp\\build\\serverBaseDir_jetty9.3",
    "webApps": [{
            "inplace": true,
            "inplaceMode": "soft",
            "webappClassPath": ["file:/C:/Users/user/eclipse-workspace/WS/MyWebApp/build/classes/java/main/", "file:/C:/Users/user/eclipse-workspace/WS/MyWebApp/build/resources/main", "file:/C:/Users/user/.gradle/caches/modules-2/files-2.1/org.springframework/spring-web/4.3.7.RELEASE/7b69fc68cdb74c1c92f72905af6995696fcb56aa/spring-web-4.3.7.RELEASE.jar", "file:/C:/Users/user/.gradle/caches/modules-2/files-2.1/org.springframework/spring-core/4.3.7.RELEASE/54fa2db94cc7222edc90ec71354e47cd1dc07f7b/spring-core-4.3.7.RELEASE.jar", "file:/C:/Users/user/.gradle/caches/modules-2/files-2.1/commons-logging/commons-logging/1.2/4bfc12adfe4842bf07b657f0369c4cb522955686/commons-logging-1.2.jar", "file:/C:/Users/user/.gradle/caches/modules-2/files-2.1/org.springframework/spring-beans/4.3.7.RELEASE/2de9f59f3202965438f3a02057d6ad8274636044/spring-beans-4.3.7.RELEASE.jar", "file:/C:/Users/user/.gradle/caches/modules-2/files-2.1/org.springframework/spring-aop/4.3.7.RELEASE/3f243d685e4a8a78a0c291445c6d85560ec4d339/spring-aop-4.3.7.RELEASE.jar", "file:/C:/Users/user/.gradle/caches/modules-2/files-2.1/org.springframework/spring-context/4.3.7.RELEASE/34b66b0b7910122ef95ba4fff6da9238ef80a5de/spring-context-4.3.7.RELEASE.jar", "file:/C:/Users/user/.gradle/caches/modules-2/files-2.1/org.springframework/spring-expression/4.3.7.RELEASE/5257b6486e43d8c05674323fea5b415d4da72f38/spring-expression-4.3.7.RELEASE.jar", "file:/C:/Users/user/.gradle/caches/modules-2/files-2.1/org.apache.cxf/cxf-rt-frontend-jaxws/3.1.12/b692298ec0df9920732e4248c52b136515c5b286/cxf-rt-frontend-jaxws-3.1.12.jar", "file:/C:/Users/user/.gradle/caches/modules-2/files-2.1/org.apache.cxf/cxf-core/3.1.12/ff07181b388f099e9e7095cbe3d586a391d84dc3/cxf-core-3.1.12.jar", "file:/C:/Users/user/.gradle/caches/modules-2/files-2.1/org.apache.ws.xmlschema/xmlschema-core/2.2.2/3346ea4712a8bc80dbc1877628bfca1d6c4d55ef/xmlschema-core-2.2.2.jar", "file:/C:/Users/user/.gradle/caches/modules-2/files-2.1/org.codehaus.woodstox/woodstox-core-asl/4.4.1/84fee5eb1a4a1cefe65b6883c73b3fa83be3c1a1/woodstox-core-asl-4.4.1.jar", "file:/C:/Users/user/.gradle/caches/modules-2/files-2.1/org.codehaus.woodstox/stax2-api/3.1.4/ac19014b1e6a7c08aad07fe114af792676b685b7/stax2-api-3.1.4.jar", "file:/C:/Users/user/.gradle/caches/modules-2/files-2.1/org.apache.cxf/cxf-rt-bindings-xml/3.1.12/d7cc73475b7fd4be85b67d94c980da9b89cc365b/cxf-rt-bindings-xml-3.1.12.jar", "file:/C:/Users/user/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm/5.0.4/da08b8cce7bbf903602a25a3a163ae252435795/asm-5.0.4.jar", "file:/C:/Users/user/.gradle/caches/modules-2/files-2.1/org.apache.cxf/cxf-rt-bindings-soap/3.1.12/593a4f533452842d76ced8c23b230e0ed0e033db/cxf-rt-bindings-soap-3.1.12.jar", "file:/C:/Users/user/.gradle/caches/modules-2/files-2.1/org.apache.cxf/cxf-rt-wsdl/3.1.12/cc2bf92c9818b12aa9a8383297c15b5ee51f8a44/cxf-rt-wsdl-3.1.12.jar", "file:/C:/Users/user/.gradle/caches/modules-2/files-2.1/wsdl4j/wsdl4j/1.6.3/6d106a6845a3d3477a1560008479312888e94f2f/wsdl4j-1.6.3.jar", "file:/C:/Users/user/.gradle/caches/modules-2/files-2.1/org.apache.cxf/cxf-rt-databinding-jaxb/3.1.12/c0a312c95af2197a0f0496f903442ece0c3d6cc6/cxf-rt-databinding-jaxb-3.1.12.jar", "file:/C:/Users/user/.gradle/caches/modules-2/files-2.1/com.sun.xml.bind/jaxb-core/2.2.11/c3f87d654f8d5943cd08592f3f758856544d279a/jaxb-core-2.2.11.jar", "file:/C:/Users/user/.gradle/caches/modules-2/files-2.1/com.sun.xml.bind/jaxb-impl/2.2.11/a49ce57aee680f9435f49ba6ef427d38c93247a6/jaxb-impl-2.2.11.jar", "file:/C:/Users/user/.gradle/caches/modules-2/files-2.1/org.apache.cxf/cxf-rt-ws-addr/3.1.12/aea598a46cfb69e9cb61c06684461b225e304e5c/cxf-rt-ws-addr-3.1.12.jar", "file:/C:/Users/user/.gradle/caches/modules-2/files-2.1/org.apache.cxf/cxf-rt-ws-policy/3.1.12/18364d215dc9df5821b118b0387f3aef4ebd1b8d/cxf-rt-ws-policy-3.1.12.jar", "file:/C:/Users/user/.gradle/caches/modules-2/files-2.1/org.apache.neethi/neethi/3.0.3/ee37a38bbf9f355ee88ba554a85c9220b75ba500/neethi-3.0.3.jar", "file:/C:/Users/user/.gradle/caches/modules-2/files-2.1/org.apache.cxf/cxf-rt-frontend-simple/3.1.12/26a89cf3181e23b31ea84e3baf3006e1c7699de7/cxf-rt-frontend-simple-3.1.12.jar", "file:/C:/Users/user/.gradle/caches/modules-2/files-2.1/xml-resolver/xml-resolver/1.2/3d0f97750b3a03e0971831566067754ba4bfd68c/xml-resolver-1.2.jar", "file:/C:/Users/user/.gradle/caches/modules-2/files-2.1/org.apache.cxf/cxf-rt-transports-http/3.1.12/3f0d7bb7971e8b0c9ce135f81debca4b5ebcd65f/cxf-rt-transports-http-3.1.12.jar", "file:/C:/Users/user/.gradle/caches/modules-2/files-2.1/org.apache.httpcomponents/httpclient/4.5.3/d1577ae15f01ef5438c5afc62162457c00a34713/httpclient-4.5.3.jar", "file:/C:/Users/user/.gradle/caches/modules-2/files-2.1/commons-codec/commons-codec/1.9/9ce04e34240f674bc72680f8b843b1457383161a/commons-codec-1.9.jar", "file:/C:/Users/user/.gradle/caches/modules-2/files-2.1/org.apache.httpcomponents/httpcore/4.4.6/e3fd8ced1f52c7574af952e2e6da0df8df08eb82/httpcore-4.4.6.jar", "file:/C:/Users/user/.gradle/caches/modules-2/files-2.1/com.cgi..3rdparty/ojdbc8/12.2.0.1.0/60f439fd01536508df32658d0a416c49ac6f07fb/ojdbc8-12.2.0.1.0.jar", "file:/C:/Users/user/.gradle/caches/modules-2/files-2.1/soap/soap/2.3.1/b1c8d536eead15574d6324b30c450176f70b830d/soap-2.3.1.jar", "file:/C:/Users/user/.gradle/caches/modules-2/files-2.1/ch.qos.logback/logback-classic/1.2.3/7c4f3c474fb2c041d8028740440937705ebb473a/logback-classic-1.2.3.jar", "file:/C:/Users/user/.gradle/caches/modules-2/files-2.1/org.slf4j/slf4j-api/1.7.25/da76ca59f6a57ee3102f8f9bd9cee742973efa8a/slf4j-api-1.7.25.jar", "file:/C:/Users/user/.gradle/caches/modules-2/files-2.1/ch.qos.logback/logback-core/1.2.3/864344400c3d4d92dfeb0a305dc87d953677c03c/logback-core-1.2.3.jar", "file:/C:/Users/user/.gradle/caches/modules-2/files-2.1/org.slf4j/jcl-over-slf4j/1.7.25/f8c32b13ff142a513eeb5b6330b1588dcb2c0461/jcl-over-slf4j-1.7.25.jar", "file:/C:/Users/user/eclipse-workspace/WS/Authentication/Client/build/classes/java/main/", "file:/C:/Users/user/eclipse-workspace/WS/Authentication/Client/build/resources/main", "file:/C:/Users/user/.gradle/caches/modules-2/files-2.1/org.apache.httpcomponents/httpclient/4.5/a1e6cbb3cc2c5f210dd1310ff9fcb2c09c0d1438/httpclient-4.5.jar", "file:/C:/Users/user/.gradle/caches/modules-2/files-2.1/org.apache.httpcomponents/httpcore/4.4.1/f5aa318bda4c6c8d688c9d00b90681dcd82ce636/httpcore-4.4.1.jar", "file:/C:/Users/user/eclipse-workspace/WS/MonitoringSupport/build/classes/java/main/", "file:/C:/Users/user/eclipse-workspace/WS/MonitoringSupport/build/resources/main", "file:/C:/Users/user/eclipse-workspace/WS/Plus/build/classes/java/main/", "file:/C:/Users/user/eclipse-workspace/WS/Plus/build/resources/main/"],
            "contextPath": "/MyWebApp",
            "webXml": null,
            "resourceBase": "C:\\Users\\user\\eclipse-workspace\\WS\\MyWebApp\\build/inplaceWebapp/"
        }
    ]
    }

See the CP part:

here is the jetty.xml:

<Configure id="Server" class="org.eclipse.jetty.server.Server">
<New id="ResourceRef_MyWebApp" class="org.eclipse.jetty.plus.jndi.Resource">
    <Arg></Arg>
    <Arg>jdbc/MyWebAppDS</Arg>
    <Arg>
      <New class="oracle.jdbc.pool.OracleDataSource">
        <Set name="DriverType">thin</Set>
        <Set name="URL">jdbc:oracle:thin:@localhost:1521/XE</Set>
        <Set name="User">user</Set>
        <Set name="Password">passwd</Set>
        <Set name="connectionCachingEnabled">true</Set>
        <Set name="connectionCacheProperties">
          <New class="java.util.Properties">
            <Call name="setProperty">
              <Arg>MinLimit</Arg>
              <Arg>5</Arg>
            </Call>
          </New>
        </Set>
      </New>
    </Arg>
 </New>
 </Configure>

It's Jetty server configuration for Oracle JNDI DS. Unfortunately Gretty plugin reports "Config error" with no detail:

15:47:58.311 [QUIET] [system.out] 07/15/19 15:47:58.311 [main] WARN  Config error at <New id="ResourceRef_MyWebApp" class="org.eclipse.jetty.plus.jndi.Resource"><Arg/><Arg>jdbc/MyWebAppDS</Arg><Arg>
15:47:58.311 [QUIET] [system.out]       <New class="oracle.jdbc.pool.OracleDataSource"><Set name="DriverType">thin</Set><Set name="URL">jdbc:oracle:thin:@localhost:1521/XE</Set><Set name="User">user</Set><Set name="Password">passwd</Set><Set name="connectionCachingEnabled">true</Set><Set name="connectionCacheProperties">
15:47:58.312 [QUIET] [system.out]           <New class="java.util.Properties"><Call name="setProperty"><Arg>MinLimit</Arg><Arg>5</Arg></Call></New>
15:47:58.312 [QUIET] [system.out]         </Set></New>
15:47:58.312 [QUIET] [system.out]     </Arg></New>  [o.e.j.x.XmlConfiguration] [XmlConfiguration.java:451]
15:47:58.350 [DEBUG] [org.gradle.process.internal.DefaultExecHandle] Changing state to: FAILED
15:47:58.350 [DEBUG] [org.gradle.process.internal.DefaultExecHandle] Process 'command 'C:\Java\jdk1.8.0_191\bin\java.exe'' finished with exit value 1 (state: FAILED)

and Jetty ClassLoader produce:

15:47:58.312 [ERROR] [system.err] Exception in thread "main" java.lang.ClassNotFoundException: oracle.jdbc.pool.OracleDataSource
15:47:58.313 [ERROR] [system.err]       at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
15:47:58.313 [ERROR] [system.err]       at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
15:47:58.313 [ERROR] [system.err]       at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
15:47:58.313 [ERROR] [system.err]       at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
15:47:58.313 [ERROR] [system.err]       at org.eclipse.jetty.util.Loader.loadClass(Loader.java:86)

it's obviously CL issue, but I don't know where to add ojdbc.jar to be usable by jetty. (I do not like to add it into java.class.path System Property, but like to use it only for all web applications in build).

回答1:

Classes loaded by jetty.xml are part of the Server classpath.

But your oracle class is configured to be part of your webapp's classpath.

The Server cannot see into your WebApp due to standard WebApp classpath isolation.

Move your oracle jar to the Server classpath.