[英]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.