2

I have various versions of tomcat 6 and 7 running across my production environments, so I am attempting to reproduce this on my dev box by adding servers to Eclipse using the various tomcat versions.

I have a server setup running tomcat 6.0.51. To the server.xml, I am adding the various JNDI resources I need to run my application. Everything works as expected.

I am now setting up a tomcat 7.0.50 server instance in Eclispe and I add the exact same JNDI resouces. But this time I receive the following error:

Jun 02, 2017 9:23:42 AM org.apache.catalina.mbeans.GlobalResourcesLifecycleListener createMBeans
SEVERE: Exception processing Global JNDI Resources
javax.naming.NamingException: Could not load resource factory class [Root exception is java.lang.ClassNotFoundException: oracle.jdbc.pool.OracleDataSourceFactory]
    at org.apache.naming.factory.ResourceFactory.getObjectInstance(ResourceFactory.java:84)
    at javax.naming.spi.NamingManager.getObjectInstance(Unknown Source)
    at org.apache.naming.NamingContext.lookup(NamingContext.java:843)
    at org.apache.naming.NamingContext.lookup(NamingContext.java:154)
    at org.apache.naming.NamingContextBindingsEnumeration.nextElementInternal(NamingContextBindingsEnumeration.java:119)
    at org.apache.naming.NamingContextBindingsEnumeration.next(NamingContextBindingsEnumeration.java:73)
    at org.apache.naming.NamingContextBindingsEnumeration.next(NamingContextBindingsEnumeration.java:36)
    at org.apache.catalina.mbeans.GlobalResourcesLifecycleListener.createMBeans(GlobalResourcesLifecycleListener.java:140)
    at org.apache.catalina.mbeans.GlobalResourcesLifecycleListener.createMBeans(GlobalResourcesLifecycleListener.java:112)
    at org.apache.catalina.mbeans.GlobalResourcesLifecycleListener.lifecycleEvent(GlobalResourcesLifecycleListener.java:84)
    at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119)
    at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90)
    at org.apache.catalina.util.LifecycleBase.setStateInternal(LifecycleBase.java:402)
    at org.apache.catalina.util.LifecycleBase.setState(LifecycleBase.java:347)
    at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:725)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.startup.Catalina.start(Catalina.java:690)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:322)
    at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:456)
Caused by: java.lang.ClassNotFoundException: oracle.jdbc.pool.OracleDataSourceFactory
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at org.apache.naming.factory.ResourceFactory.getObjectInstance(ResourceFactory.java:82)
    ... 22 more

The resource definition, in both server.xml files looks like

<Resource auth="Container" 
    connectionCacheName="..."
    connectionCacheProperties="..."
    connectionCachingEnabled="true" 
    driverClassName="oracle.jdbc.OracleDriver"
    factory="oracle.jdbc.pool.OracleDataSourceFactory" 
    name="..."
    password="..." 
    type="oracle.jdbc.pool.OracleDataSource"
    url="jdbc:oracle:thin:@//***.***.***.***:1534/..." user="..." />

The jar file being used is the ojdbc.jar file and is located in the WEB-INF/lib folder inside the application folder.

So I am confused, why would this work in tc 6.0.51 but not in tc 7.0.50? What am I doing wrong?

I have reviewed a lot of "ClassNotFound" exceptions here on SO including this one which describes a very similar situation, but has no good answer.

I am not attempting to deploy, I am simply trying to run this app within Eclipse to debug an issue and I want to be sure I am reproducing the issue under the exact same conditions.

EDIT

Following Krishna's comment, I downloaded the suggested jar file and did actually move it from the webapp's WEB-INF/lib folder to the tc 7.0.50 install /lib folder.

Now the error has changed to:

Jun 02, 2017 11:46:17 AM org.apache.catalina.mbeans.GlobalResourcesLifecycleListener createMBeans
SEVERE: Exception processing Global JNDI Resources
javax.naming.NamingException: Could not create resource factory instance [Root exception is java.lang.ClassCastException: oracle.jdbc.pool.OracleConnectionPoolDataSource cannot be cast to javax.naming.spi.ObjectFactory]
    at org.apache.naming.factory.ResourceFactory.getObjectInstance(ResourceFactory.java:105)
    at javax.naming.spi.NamingManager.getObjectInstance(Unknown Source)
    at org.apache.naming.NamingContext.lookup(NamingContext.java:843)
    at org.apache.naming.NamingContext.lookup(NamingContext.java:154)
    at org.apache.naming.NamingContextBindingsEnumeration.nextElementInternal(NamingContextBindingsEnumeration.java:119)
    at org.apache.naming.NamingContextBindingsEnumeration.next(NamingContextBindingsEnumeration.java:73)
    at org.apache.naming.NamingContextBindingsEnumeration.next(NamingContextBindingsEnumeration.java:36)
    at org.apache.catalina.mbeans.GlobalResourcesLifecycleListener.createMBeans(GlobalResourcesLifecycleListener.java:140)
    at org.apache.catalina.mbeans.GlobalResourcesLifecycleListener.createMBeans(GlobalResourcesLifecycleListener.java:112)
    at org.apache.catalina.mbeans.GlobalResourcesLifecycleListener.lifecycleEvent(GlobalResourcesLifecycleListener.java:84)
    at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119)
    at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90)
    at org.apache.catalina.util.LifecycleBase.setStateInternal(LifecycleBase.java:402)
    at org.apache.catalina.util.LifecycleBase.setState(LifecycleBase.java:347)
    at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:725)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.startup.Catalina.start(Catalina.java:690)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:322)
    at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:456)
Caused by: java.lang.ClassCastException: oracle.jdbc.pool.OracleConnectionPoolDataSource cannot be cast to javax.naming.spi.ObjectFactory
    at org.apache.naming.factory.ResourceFactory.getObjectInstance(ResourceFactory.java:101)
    ... 22 more

Reading this apache tomcat users mailing list I added the specified type of "javax.sql.DataSource", but to no avail.

Other suggestions?

Edit 2

Removing the factory="oracle.jdbc.pool.OracleDataSourceFactory" from the resource configuration did help the issue, but then is my connected to the database still a pooled connection?

Paul Stoner
  • 1,359
  • 21
  • 44
  • Try downloading this jar file http://www.java2s.com/Code/JarDownload/ojdbc14/ojdbc14-9.2.0.1.jar.zip to CATALINA_HOME/lib directory & change `factory="oracle.jdbc.pool.OracleDataSourceFactory"` to `factory="oracle.jdbc.pool.OracleConnectionPoolDataSource"` – kk. Jun 02 '17 at 13:53

0 Answers0