Hi everybody,

I have found a strange behavior on Tomcat 9.0.5 (originally on Tomcat
8.5.28).


# PROBLEM

I have two datasources in the same web application:

    <ResourceLink global="jdbc/abc/ABC" name="jdbc/abc"
type="javax.sql.DataSource"/>
    <ResourceLink global="jdbc/abc/jkl/XXX_YYY" name="jdbc/abc/jkl"
type="javax.sql.DataSource"/>

Starting the server I get an "java.lang.ClassCastException:
org.apache.tomcat.dbcp.dbcp2.BasicDataSource cannot be cast to
javax.naming.Context" ERROR.



# HOW TO REPRODUCE THE ERROR

In my Apache Tomcat 9.0.5's server.xml:

    <GlobalNamingResources>
        <Resource name="jdbc/abc/ABC"
                  type="javax.sql.DataSource"
                  driverClassName="oracle.jdbc.OracleDriver"
                  url="jdbc:oracle:thin:@machine1:1678:DEV"
                  auth="Container" username="ABC"
password="**************************************"
                  maxTotal="8" maxIdle="4" logAbandoned="true"
        />
        <Resource name="jdbc/abc/jkl/XXX_YYY"
                  type="javax.sql.DataSource"
                  driverClassName="oracle.jdbc.OracleDriver"
                  url="jdbc:oracle:thin:@machine1:1678:DEV"
                  auth="Container" username="XXX_YYY"
password="**************************************"
                  maxTotal="8" maxIdle="4" logAbandoned="true"
        />
    </GlobalNamingResources>

In C:\my-favourite-ide\abc\src\main\webapp\META-INF\context.xml (it's an
Apache Maven project):

    <?xml version="1.0" encoding="UTF-8"?>
    <Context useHttpOnly="true" path="/abc">
        <!--
            "global" attribute links to GlobalNamingResources in the
${catalina.base}/conf/server.xml (server administrator team)
            "name" attribute is relative to the JNDI context java:comp/env/
and is looked up from the java application (application developer team)
        -->
        <ResourceLink global="jdbc/abc/ABC" name="jdbc/abc"
type="javax.sql.DataSource"/>
        <ResourceLink global="jdbc/abc/jkl/XXX_YYY" name="jdbc/abc/jkl"
type="javax.sql.DataSource"/>
    </Context>

In C:\my-favourite-ide\abc\src\main\webapp\WEB-INF\web.xml:

    <resource-ref>
        <description>Datasource ofv</description>
        <res-ref-name>jdbc/abc</res-ref-name>
        <res-type>javax.sql.DataSource</res-type>
        <res-auth>Container</res-auth>
    </resource-ref>
    <resource-ref>
        <description>Datasource ofv</description>
        <res-ref-name>jdbc/abc/jkl</res-ref-name>
        <res-type>javax.sql.DataSource</res-type>
        <res-auth>Container</res-auth>
    </resource-ref>

Starting the server I get the "java.lang.ClassCastException:
org.apache.tomcat.dbcp.dbcp2.BasicDataSource cannot be cast to
javax.naming.Context" ERROR:

Using CATALINA_BASE:   "C:\java\apache-tomcat-9.0.5-catalina-base"
Using CATALINA_HOME:   "C:\java\apache-tomcat-9.0.5"
Using CATALINA_TMPDIR: "C:\java\apache-tomcat-9.0.5-catalina-base\temp"
Using JRE_HOME:        "C:\java\jdk1.8.0_111"
Using CLASSPATH:
 
"C:\java\apache-tomcat-9.0.5\bin\bootstrap.jar;C:\java\apache-tomcat-9.0.5\bin\tomcat-juli.jar"
06-Mar-2018 10:23:07.968 WARN [main]
org.apache.catalina.startup.VersionLoggerListener.log Server version:
  Apache Tomcat/9.0.5
06-Mar-2018 10:23:07.984 WARN [main]
org.apache.catalina.startup.VersionLoggerListener.log Server built:
  Feb 6 2018 21:42:23 UTC
06-Mar-2018 10:23:07.984 WARN [main]
org.apache.catalina.startup.VersionLoggerListener.log Server number:
 9.0.5.0
06-Mar-2018 10:23:07.984 WARN [main]
org.apache.catalina.startup.VersionLoggerListener.log OS Name:
 Windows 7
06-Mar-2018 10:23:07.984 WARN [main]
org.apache.catalina.startup.VersionLoggerListener.log OS Version:
  6.1
06-Mar-2018 10:23:07.984 WARN [main]
org.apache.catalina.startup.VersionLoggerListener.log Architecture:
  amd64
06-Mar-2018 10:23:07.984 WARN [main]
org.apache.catalina.startup.VersionLoggerListener.log Java Home:
 C:\java\jdk1.8.0_111\jre
06-Mar-2018 10:23:07.984 WARN [main]
org.apache.catalina.startup.VersionLoggerListener.log JVM Version:
 1.8.0_111-b14
06-Mar-2018 10:23:07.984 WARN [main]
org.apache.catalina.startup.VersionLoggerListener.log JVM Vendor:
  Oracle Corporation
06-Mar-2018 10:23:07.984 WARN [main]
org.apache.catalina.startup.VersionLoggerListener.log CATALINA_BASE:
 C:\java\apache-tomcat-9.0.5-catalina-base
06-Mar-2018 10:23:07.984 WARN [main]
org.apache.catalina.startup.VersionLoggerListener.log CATALINA_HOME:
 C:\java\apache-tomcat-9.0.5
06-Mar-2018 10:23:07.984 WARN [main]
org.apache.catalina.startup.VersionLoggerListener.log Command line
argument:
-Djava.util.logging.config.file=C:\java\apache-tomcat-9.0.5-catalina-base\conf\logging.properties
06-Mar-2018 10:23:07.984 WARN [main]
org.apache.catalina.startup.VersionLoggerListener.log Command line
argument: -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
06-Mar-2018 10:23:07.984 WARN [main]
org.apache.catalina.startup.VersionLoggerListener.log Command line
argument: -Djdk.tls.ephemeralDHKeySize=2048
06-Mar-2018 10:23:07.984 WARN [main]
org.apache.catalina.startup.VersionLoggerListener.log Command line
argument: -Djava.protocol.handler.pkgs=org.apache.catalina.webresources
06-Mar-2018 10:23:07.984 WARN [main]
org.apache.catalina.startup.VersionLoggerListener.log Command line
argument: -Dignore.endorsed.dirs=
06-Mar-2018 10:23:07.984 WARN [main]
org.apache.catalina.startup.VersionLoggerListener.log Command line
argument: -Dcatalina.base=C:\java\apache-tomcat-9.0.5-catalina-base
06-Mar-2018 10:23:07.984 WARN [main]
org.apache.catalina.startup.VersionLoggerListener.log Command line
argument: -Dcatalina.home=C:\java\apache-tomcat-9.0.5
06-Mar-2018 10:23:07.984 WARN [main]
org.apache.catalina.startup.VersionLoggerListener.log Command line
argument: -Djava.io.tmpdir=C:\java\apache-tomcat-9.0.5-catalina-base\temp
06-Mar-2018 10:23:07.984 WARN [main]
org.apache.catalina.core.AprLifecycleListener.lifecycleEvent Loaded APR
based Apache Tomcat Native library [1.2.16] using APR version [1.6.3].
06-Mar-2018 10:23:07.984 WARN [main]
org.apache.catalina.core.AprLifecycleListener.lifecycleEvent APR
capabilities: IPv6 [true], sendfile [true], accept filters [false], random
[true].
06-Mar-2018 10:23:07.984 WARN [main]
org.apache.catalina.core.AprLifecycleListener.lifecycleEvent APR/OpenSSL
configuration: useAprConnector [false], useOpenSSL [true]
06-Mar-2018 10:23:08.545 WARN [main]
org.apache.catalina.core.AprLifecycleListener.initializeSSL OpenSSL
successfully initialized [OpenSSL 1.0.2m  2 Nov 2017]
06-Mar-2018 10:23:08.920 WARN [main]
org.apache.coyote.AbstractProtocol.init Initializing ProtocolHandler
["http-nio-8080"]
06-Mar-2018 10:23:08.966 WARN [main]
org.apache.tomcat.util.net.NioSelectorPool.getSharedSelector Using a shared
selector for servlet write/read
06-Mar-2018 10:23:08.966 WARN [main]
org.apache.coyote.AbstractProtocol.init Initializing ProtocolHandler
["ajp-nio-8009"]
06-Mar-2018 10:23:08.966 WARN [main]
org.apache.tomcat.util.net.NioSelectorPool.getSharedSelector Using a shared
selector for servlet write/read
06-Mar-2018 10:23:08.966 WARN [main]
org.apache.catalina.startup.Catalina.load Initialization processed in 1349
ms
06-Mar-2018 10:23:08.998 WARN [main]
org.apache.catalina.core.StandardService.startInternal Starting service
[Catalina]
06-Mar-2018 10:23:08.998 WARN [main]
org.apache.catalina.core.StandardEngine.startInternal Starting Servlet
Engine: Apache Tomcat/9.0.5
06-Mar-2018 10:23:09.029 WARN [main]
org.apache.catalina.startup.HostConfig.deployDescriptor Deploying
configuration descriptor
[C:\java\apache-tomcat-9.0.5-catalina-base\conf\Catalina\localhost\manager.xml]
06-Mar-2018 10:23:09.668 WARN [main]
org.apache.jasper.servlet.TldScanner.scanJars At least one JAR was scanned
for TLDs yet contained no TLDs. Enable debug logging for this logger for a
complete list of JARs that were scanned but no TLDs were found in them.
Skipping unneeded JARs during scanning can improve startup time and JSP
compilation time.
06-Mar-2018 10:23:09.715 WARN [main]
org.apache.catalina.startup.HostConfig.deployDescriptor Deployment of
configuration descriptor
[C:\java\apache-tomcat-9.0.5-catalina-base\conf\Catalina\localhost\manager.xml]
has finished in [686] ms
06-Mar-2018 10:23:09.715 WARN [main]
org.apache.catalina.startup.HostConfig.deployDescriptor Deploying
configuration descriptor
[C:\java\apache-tomcat-9.0.5-catalina-base\conf\Catalina\localhost\abc.xml]
06-Mar-2018 10:23:12.773 GRAVE [main]
org.apache.catalina.core.ContainerBase.addChildInternal
ContainerBase.addChild: start:
 org.apache.catalina.LifecycleException: Failed to start component
[StandardEngine[Catalina].StandardHost[localhost].StandardContext[/abc]]
at
org.apache.catalina.util.LifecycleBase.handleSubClassException(LifecycleBase.java:441)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:198)
at
org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:740)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:716)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:703)
at
org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:619)
at
org.apache.catalina.startup.HostConfig$DeployDescriptor.run(HostConfig.java:1829)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at
org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75)
at
java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:112)
at
org.apache.catalina.startup.HostConfig.deployDescriptors(HostConfig.java:530)
at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:429)
at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1575)
at
org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:308)
at
org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:123)
at
org.apache.catalina.util.LifecycleBase.setStateInternal(LifecycleBase.java:424)
at org.apache.catalina.util.LifecycleBase.setState(LifecycleBase.java:367)
at
org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:964)
at
org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:839)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
at
org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1425)
at
org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1415)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at
org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75)
at
java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:134)
at
org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:941)
at
org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:258)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
at
org.apache.catalina.core.StandardService.startInternal(StandardService.java:422)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
at
org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:770)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
at org.apache.catalina.startup.Catalina.start(Catalina.java:682)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:353)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:493)
Caused by: java.lang.ClassCastException:
org.apache.tomcat.dbcp.dbcp2.BasicDataSource cannot be cast to
javax.naming.Context
at
org.apache.catalina.core.NamingContextListener.createSubcontexts(NamingContextListener.java:1310)
at
org.apache.catalina.core.NamingContextListener.addResourceLink(NamingContextListener.java:1156)
at
org.apache.catalina.core.NamingContextListener.createNamingContext(NamingContextListener.java:655)
at
org.apache.catalina.core.NamingContextListener.lifecycleEvent(NamingContextListener.java:249)
at
org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:123)
at
org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:4997)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
... 38 more

06-Mar-2018 10:23:12.898 GRAVE [main]
org.apache.catalina.startup.HostConfig.deployDescriptor Error deploying
configuration descriptor
[C:\java\apache-tomcat-9.0.5-catalina-base\conf\Catalina\localhost\abc.xml]
 java.lang.IllegalStateException: ContainerBase.addChild: start:
org.apache.catalina.LifecycleException: Failed to start component
[StandardEngine[Catalina].StandardHost[localhost].StandardContext[/abc]]
at
org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:744)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:716)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:703)
at
org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:619)
at
org.apache.catalina.startup.HostConfig$DeployDescriptor.run(HostConfig.java:1829)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at
org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75)
at
java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:112)
at
org.apache.catalina.startup.HostConfig.deployDescriptors(HostConfig.java:530)
at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:429)
at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1575)
at
org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:308)
at
org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:123)
at
org.apache.catalina.util.LifecycleBase.setStateInternal(LifecycleBase.java:424)
at org.apache.catalina.util.LifecycleBase.setState(LifecycleBase.java:367)
at
org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:964)
at
org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:839)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
at
org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1425)
at
org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1415)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at
org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75)
at
java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:134)
at
org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:941)
at
org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:258)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
at
org.apache.catalina.core.StandardService.startInternal(StandardService.java:422)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
at
org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:770)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
at org.apache.catalina.startup.Catalina.start(Catalina.java:682)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:353)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:493)

06-Mar-2018 10:23:12.898 WARN [main]
org.apache.catalina.startup.HostConfig.deployDescriptor Deployment of
configuration descriptor
[C:\java\apache-tomcat-9.0.5-catalina-base\conf\Catalina\localhost\abc.xml]
has finished in [3,183] ms
06-Mar-2018 10:23:12.898 WARN [main]
org.apache.catalina.startup.HostConfig.deployDescriptor Deploying
configuration descriptor
[C:\java\apache-tomcat-9.0.5-catalina-base\conf\Catalina\localhost\ROOT.xml]
06-Mar-2018 10:23:13.475 WARN [main]
org.apache.jasper.servlet.TldScanner.scanJars At least one JAR was scanned
for TLDs yet contained no TLDs. Enable debug logging for this logger for a
complete list of JARs that were scanned but no TLDs were found in them.
Skipping unneeded JARs during scanning can improve startup time and JSP
compilation time.
06-Mar-2018 10:23:13.475 WARN [main]
org.apache.catalina.startup.HostConfig.deployDescriptor Deployment of
configuration descriptor
[C:\java\apache-tomcat-9.0.5-catalina-base\conf\Catalina\localhost\ROOT.xml]
has finished in [577] ms
06-Mar-2018 10:23:13.475 WARN [main]
org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler
["http-nio-8080"]
06-Mar-2018 10:23:13.490 WARN [main]
org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler
["ajp-nio-8009"]
06-Mar-2018 10:23:13.490 WARN [main]
org.apache.catalina.startup.Catalina.start Server startup in 4521 ms



## NOTES

The error seems realted only to ResourceLink's "name" attribute, and not to
"global" attribute, in server.xml:

ERROR
<ResourceLink global="jdbc/abc/ABC" name="jdbc/abc"
type="javax.sql.DataSource"/>
<ResourceLink global="jdbc/abc/jkl/XXX_YYY" name="jdbc/abc/jkl"
type="javax.sql.DataSource"/>

The error disappears with the following "name" attribute values (of course
when I change the "name" attribute value I change accordingly the
"<res-ref-name>" tag body in the web.xml):

WORKS FINE
<ResourceLink global="jdbc/abc/ABC" name="jdbc/abc"
type="javax.sql.DataSource"/>
<ResourceLink global="jdbc/abc/jkl/XXX_YYY" name="jdbc/abx/jkl"
type="javax.sql.DataSource"/>

WORKS FINE
<ResourceLink global="jdbc/abc/ABC" name="jdbc/abc"
type="javax.sql.DataSource"/>
<ResourceLink global="jdbc/abc/jkl/XXX_YYY" name="jdbc/axc/jkl"
type="javax.sql.DataSource"/>

WORKS FINE
<ResourceLink global="jdbc/abc/ABC" name="jdbc/abc"
type="javax.sql.DataSource"/>
<ResourceLink global="jdbc/abc/jkl/XXX_YYY" name="jdbc/xbc/jkl"
type="javax.sql.DataSource"/>

WORKS FINE
<ResourceLink global="jdbc/abc/ABC" name="jdbc/abc"
type="javax.sql.DataSource"/>
<ResourceLink global="jdbc/abc/jkl/XXX_YYY" name="jdbc/aabc/jkl"
type="javax.sql.DataSource"/>

WORKS FINE
<ResourceLink global="jdbc/abc/ABC" name="jdbc/abc"
type="javax.sql.DataSource"/>
<ResourceLink global="jdbc/abc/jkl/XXX_YYY" name="jdbc/abcc/jkl"
type="javax.sql.DataSource"/>



Thank you very much for your help.

Best regards,
Tarin
www.taringamberini.com/en/blog

Reply via email to