簡體   English   中英

Oracle JDBC驅動程序沖突

[英]Oracle JDBC driver conflict

JBoss EAP 6.1 standlone服務器

部署為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級別擁有任何JDBC驅動程序JAR。 Java EE應用服務器需要它們處於應用服務器級別。

將其移動到默認的server / lib目錄中,看看是否更好。

我不確定為什么從web-inf / lib加載不起作用。 最有可能的是類加載器是不同的。

做前兩步診斷。 之后嘗試以下兩種替代方案中的一種來解決問題。
1)通過比較rs.getObject().getClass('RATINGOBJ').getClassLoader() )來檢查類加載器是否相同rs.getObject().getClass('RATINGOBJ').getClassLoader()oracle.sql.ARRAY.class.getClassLoader()如果你在兩個類加載器之間做equals它應該返回false,因為它看起來類加載器是不同的。 在轉換為同一個類時,檢查ClassCastException的解釋

此問題已在之前的另一個論壇https://forums.oracle.com/message/9330314中報告過。 在jboss中移動jar仍然會導致相同的問題。

2)找出從哪里加載類的源jar並刪除你不需要的jar。 通過檢查找到兩個不同類的罐子
rs.getObject().getClass('RATINGOBJ').getProtectionDomain().getCodeSource().getLocation() oracle.sql.ARRAY.class.getProtectionDomain().getCodeSource().getLocation() - 確定哪個JAR文件是一個類來自

可能的解決方案:

a)如果你需要兩個罐子,你必須移動rs.getObject().getClass('RATINGOBJ').getProtectionDomain().getCodeSource().getLocation()的罐子rs.getObject().getClass('RATINGOBJ').getProtectionDomain().getCodeSource().getLocation()

並按照http://www.javaworld.com/community/node/8184中的規定創建模塊。

b)如果仍然無法按預期加載類,請在jboss服務器庫中指定庫。

c)強制從特定jar加載類的最后一個解決方案是在bootclasspath中指定jar。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM