Oracle JDBC driver conflict

雨燕双飞 提交于 2019-12-22 08:18:59

问题


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?


回答1:


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.




回答2:


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.



来源:https://stackoverflow.com/questions/17119152/oracle-jdbc-driver-conflict

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!