4

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 を削除すると、ClassCastException の代わりに ClassNotFound 例外が発生します。

この行を除いて、アプリの他のすべての部分は正常に動作します。これをさらにデバッグするにはどうすればよいですか?

4

2 に答える 2

4

web-inf/lib からの読み込みが機能しない理由がわかりません。ほとんどの場合、クラスローダーが異なります。

診断のために最初の 2 つの手順を実行します。その後、以下の 2 つの方法のいずれかを試して問題を解決してください。
1) を比較して、クラスローダーが同じかどうかを確認しrs.getObject().getClass('RATINGOBJ').getClassLoader()ます。2 つのクラスローダー間でoracle.sql.ARRAY.class.getClassLoader() 行う場合equals、クラスローダーが異なるように見えるため、false を返す必要があります。同じクラスにキャストする場合は ClassCastExceptionで説明を確認してください

この問題は、 https://forums.oracle.com/message/9330314の別のフォーラムですでに報告されています。jboss で jar を移動しても、同じ問題が発生します。

2)クラスがロードされているソースjarを見つけて、必要のないjarを削除します。チェックして、2 つの異なるクラスの jar を見つけます
rs.getObject().getClass('RATINGOBJ').getProtectionDomain().getCodeSource().getLocation() oracle.sql.ARRAY.class.getProtectionDomain().getCodeSource().getLocation() -クラスがどの JAR ファイルからのものかを判断します。

可能な解決策:

a) 両方の瓶が必要な場合は、瓶を移動する必要があります rs.getObject().getClass('RATINGOBJ').getProtectionDomain().getCodeSource().getLocation()

http://www.javaworld.com/community/node/8184で指定されているようにモジュールを作成します。

b) それでも期待どおりにクラスをロードできない場合は、jboss サーバー ライブラリでライブラリを指定します。

c) クラスを特定の jar から強制的にロードする最後の解決策は、bootclasspath で jar を指定することです。

于 2013-06-16T05:46:48.083 に答える
3

WEB-INF/lib レベルに JDBC ドライバー JAR を含めないでください。Java EE アプリ サーバーは、アプリ サーバー レベルである必要があります。

それをデフォルトのサーバーの /lib ディレクトリに移動して、それが良いかどうかを確認してください。

于 2013-06-15T00:54:06.490 に答える