java - Oracle JDBC 驱动程序冲突

标签 java oracle jboss classcastexception

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/

相关文章:

java - Scala反射: how do I define a case class at runtime and then reference to it?

带有 DBMS_ASSERT 的 Oracle SQL 注入(inject) block

database - 多列的条件唯一约束

java - 如何管理JCA ManagedConnectionFactory的生命周期?

c# - 我们可以在.Net中使用基于JAVA的drools规则吗

UCP(通用计算机协议(protocol))的 Java API

java - 为电子邮件确认创建唯一 ID

java - Jboss服务器异常

java - Unity3D 四元数 libGDX 等效项

java - 通过java小程序查询oracle数据库