Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Oracle JDBC驱动程序冲突_Java_Oracle_Jboss_Classcastexception - Fatal编程技术网

Java Oracle JDBC驱动程序冲突

Java Oracle JDBC驱动程序冲突,java,oracle,jboss,classcastexception,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\u-INF/lib)。所有库都包含在war文件中,服务器上

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\u-INF/lib)。所有库都包含在war文件中,服务器上没有“全局”库设置。我已经验证了该应用程序中没有包含其他jdbc库

为了创建JDBC数据源,我为ojdbc6.jar创建了一个部署。这是我能想到的唯一可能的冲突来源。当我从war文件中删除ojdbc6.jar时,我得到一个ClassNotFound异常来代替ClassCastException


除此之外,应用程序的所有其他部分都可以正常工作。如何进一步调试它?

您不应该在WEB-INF/lib级别有任何JDBC驱动程序JAR。JavaEE应用服务器需要它们处于应用服务器级别


将其移动到默认的server/lib目录中,看看是否更好

我不知道为什么从web inf/lib加载不起作用。很可能类加载器是不同的

执行诊断的前两个步骤。之后,请尝试以下两种方法中的一种来解决问题。
1) 通过比较
rs.getObject().getClass('RATINGOBJ').getClassLoader()
oracle.sql.ARRAY.class.getClassLoader()
如果两个类加载器之间的
equals
,它应该返回false,因为看起来类加载器是不同的。 查看下面的解释

这个问题已经在早些时候的另一个论坛上报道过。在jboss中移动jar仍然会导致相同的问题

2) 找出加载类的源jar,并删除您不需要的jar。 通过选中
rs.getObject().getClass('RATINGOBJ').getProtectionDomain().getCodeSource().getLocation()
oracle.sql.ARRAY.class.getProtectionDomain().getCodeSource().getLocation()
-

可能的解决办法:

a) 如果你需要两个罐子,你就得把瓶子移走
rs.getObject().getClass('RATINGOBJ').getProtectionDomain().getCodeSource().getLocation()

并按照中的指定创建模块

b) 如果仍然无法按预期加载类,请在jboss服务器库中指定库


c) 强制从特定jar加载类的最后一个解决方案是在bootclasspath中指定jar

也许可以尝试运行一个非常简单的测试应用程序,只使用JDBC驱动程序作为依赖项?它只是偶尔出现吗?是否每次重新部署应用程序时都重新启动服务器?每次部署应用程序时,都会重新启动服务器。我不认为这是必要的,但我还是这么做了。这不是只有当您希望容器提供例如数据库连接池时才需要的吗?如果你自己做所有事情,你就不必这么做。没错,但是为什么你要使用应用服务器而不使用连接池呢?Tomcat现在要求它,JBossServlet/JSP引擎是Tomcat的一个分支,我同意。我认为这是一个类加载器,应用程序中包含的JDBC驱动程序不用于连接池。我在appserver级别定义了一个连接池,用于此目的。我在应用程序中需要ojdbc6.jar的原因是使用java.sql.ARRAY对象。这听起来对吗?在看到这个答案后,我将ojdbc6.jar移动到JBOSS_HOME/standalone/lib,并将其从war文件中删除(并重新启动服务器)。结果是java.lang.NoClassDefFoundError:oracle/sql/ARRAY当我将ojdbc6.jar作为WEB-INF/lib的一部分时,我得到了前面的错误java.lang.ClassCastException:oracle.sql.ARRAY不能强制转换为oracle.sql.ARRAY,所有这些都是为了仅使用该包中的数组clas。我确信我在这里犯了一些根本的错误,
*******对象类加载器=模块“deployment.ojdbc5.jar:main”来自服务模块加载器******类加载器=模块“deployment.Dispatch.war:main”从服务模块加载器中******对象jarLoc=vfs:/content/ojdbc5.jar****类jarLoc=vfs:/content/Dispatch.war/WEB-INF/lib/ojdbc5.jar*******类加载器不同***************
打印了您建议的值。类装入器似乎不同。服务器上有两个部署,用于创建数据源的ojdbc5.jar和包含ojdbc5.jar的应用程序本身。我仍然无法找到JBoss EAP的服务器库。如果我从WEB\u INF/lib中删除ojdbc5.jar,我会得到ClassNotFound,如果我包含它。它与我安装为用于创建数据源的模块的同一个jar冲突。明天我将尝试测试您可能的解决方案。谢谢。我使用解决方案A解决了这个问题。用ojdbc6.jar创建了一个模块。用于定义驱动程序和创建数据源。还将jboss-deployment-structure.xml添加到应用程序war中,以引用此模块,而不是将其包含在WEB-INF/lib中。类加载器现在也显示出同样的效果,目前看来一切都很好。比较复杂的是,我是JBoss新手,没有意识到JBoss EAP 6与RedHat和JBoss AS 7之间的区别。谢谢你的意见。