Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Oracle JDBC driver conflict

JBoss EAP 6.1 standlone server

Application deployed as a war file throws a runtime exception

java.lang.ClassCastException: oracle.sql.ARRAY cannot be cast to oracle.sql.ARRAY

at line

oracle.sql.ARRAY obj = (oracle.sql.ARRAY) rs.getObject("RATINGOBJ");

JDBC libary included is ojdbc6.jar (WEB_INF/lib). All libraries are included in the war file and there are no "global" libaries setup on the server. I have verified no other jdbc libraries are included anywhere in the app.

In order to create a JDBC datasource, i created a deployment for ojdbc6.jar. This is the only possible source of conflict i can think of. When i remove the ojdbc6.jar from the war file, i get a ClassNotFound exception in place of the ClassCastException.

Every other part of the app works fine except this line. How do i debug this any further?

like image 424
BBS Avatar asked Mar 23 '23 13:03

BBS


2 Answers

I am not sure why loading from web-inf/lib will not work. Most likely the classloader's are different.

Do the first two steps for diagnosis. After that try one of the two alternatives below to fix the problem.
1) Check if the class loaders are the same by comparing the rs.getObject().getClass('RATINGOBJ').getClassLoader() and oracle.sql.ARRAY.class.getClassLoader() If you do equals between the two classloaders, it should return false as it looks that the classloaders are different. Check an explanation at ClassCastException when casting to the same class

This problem has already been reported earlier in another forum at https://forums.oracle.com/message/9330314. Moving jars around in jboss will still result in same problems.

2) Find out the source jars from where the classes are getting loaded and remove the jar that you dont need. Find the jars for the two different classes by checking
rs.getObject().getClass('RATINGOBJ').getProtectionDomain().getCodeSource().getLocation() oracle.sql.ARRAY.class.getProtectionDomain().getCodeSource().getLocation() - Determine which JAR file a class is from

Possible Solutions:

a) If you need both the jars, y'll have to move the Jar of rs.getObject().getClass('RATINGOBJ').getProtectionDomain().getCodeSource().getLocation()

and create the module as specified at http://www.javaworld.com/community/node/8184.

b) If you still cant get classes to be loaded as you expect, Specify the library in jboss server library.

c) The last solution to force classes to be loaded from a particular jar is by specifying the jar in the bootclasspath.

like image 152
randominstanceOfLivingThing Avatar answered Apr 04 '23 20:04

randominstanceOfLivingThing


You should not have any JDBC driver JARs at the WEB-INF/lib level. Java EE app servers need them to be at the app server level.

Move it into the default server /lib directory and see if that's better.

like image 40
duffymo Avatar answered Apr 04 '23 22:04

duffymo