JBoss EAP 6.1 独立服务器
部署为 war 文件的应用程序抛出运行时异常
java.lang.ClassCastException: oracle.sql.ARRAY cannot be cast to oracle.sql.ARRAY
在线
oracle.sql.ARRAY obj = (oracle.sql.ARRAY) rs.getObject("RATINGOBJ");
包含的 JDBC 库是 ojdbc6.jar (WEB_INF/lib)。所有库都包含在 war 文件中,服务器上没有设置“全局”库。我已验证应用程序中的任何位置均未包含其他 jdbc 库。
为了创建 JDBC 数据源,我为 ojdbc6.jar 创建了部署。这是我能想到的唯一可能的冲突来源。当我从 war 文件中删除 ojdbc6.jar 时,我得到一个 ClassNotFound 异常代替 ClassCastException。
除此行外,应用程序的所有其他部分都工作正常。我该如何进一步调试?
最佳答案
我不确定为什么无法从 web-inf/lib 加载。类加载器很可能是不同的。
做前两步进行诊断。之后尝试使用以下两种方法之一来解决问题。
1) 通过比较 rs.getObject().getClass('RATINGOBJ').getClassLoader()
和 oracle.sql.ARRAY.class.getClassLoader( )
如果您在两个类加载器之间执行 equals
,它应该返回 false,因为看起来类加载器是不同的。
查看解释
ClassCastException when casting to the same class
此问题早前已在另一个论坛中报告过 https://forums.oracle.com/message/9330314 .在 jboss 中移动 jar 仍然会导致同样的问题。
2) 从加载类的位置找出源 jar 并删除不需要的 jar。
通过检查找到两个不同类的 jar
rs.getObject().getClass('RATINGOBJ').getProtectionDomain().getCodeSource().getLocation()
oracle.sql.ARRAY.class.getProtectionDomain().getCodeSource().getLocation()
- Determine which JAR file a class is from
可能的解决方案:
a) 如果你需要两个 jar ,你必须移动 Jar of
rs.getObject().getClass('RATINGOBJ').getProtectionDomain().getCodeSource().getLocation()
并按照 http://www.javaworld.com/community/node/8184 中指定的方式创建模块.
b) 如果您仍然无法按预期加载类,请在 jboss 服务器库中指定库。
c) 强制从特定 jar 加载类的最后一个解决方案是在 bootclasspath 中指定 jar。
关于java - Oracle JDBC 驱动程序冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17119152/