1

SocketChannel を拡張しようとしましたが、SocketChannel には JRE 1.7.4 (http://openjdk.java.net/projects/nio/javadoc/java/nio/channels/SocketChannel.html) から利用可能な新しい API メソッドがいくつかあるようです。問題は、これらのメソッドを実装すると、Java 1.6 を使用しているときに JAR が次のエラーをスローすることです。

Exception in thread "Thread-24" java.lang.NoClassDefFoundError: java/nio/channels/NetworkChannel

これで、「java/nio/channels/NetworkChannel」に関連するエラーが発生する理由がわかりました。SocketChannel は、JRE 1.7 以降の NetworkChannel とインターフェイスしているようです。

現在、JRE 1.7.4+ を使用しているときに実行時エラーが発生します。実際には奇妙なことに、これらの新しい API メソッドを実装していても、「unwrap」メソッドを呼び出すと実行時エラーが発生します。

Exception in thread "Thread-27" java.lang.RuntimeException: Delegated task threw Exception/Error
at sun.security.ssl.Handshaker.checkThrown(Unknown Source)
at sun.security.ssl.SSLEngineImpl.checkTaskThrown(Unknown Source)
at sun.security.ssl.SSLEngineImpl.readNetRecord(Unknown Source)
at sun.security.ssl.SSLEngineImpl.unwrap(Unknown Source)
at javax.net.ssl.SSLEngine.unwrap(Unknown Source)
at CustomSocketChannel.unwrap(CustomSocketChannel.java:565)

その行で sslEngine.unwrap メソッドを呼び出すだけなので、新しい API メソッドを実装すると、JRE 1.7.0 から 1.7.3 でのみ機能します。

SocketChannel クラスを拡張しながら、JRE 1.6 および 1.7 と互換性のある JAR を作成するにはどうすればよいですか?

4

1 に答える 1

1

OK、JRE 1.7.4+ のランタイム エラーに関する問題を特定したようです。これは実際にはラップ解除エラーではなく、証明書エラーであるようです。 SSLEngine.unwrap を呼び出すと、その実行時エラーが発生します

Exception in thread "Thread-24" java.lang.RuntimeException: Delegated task threw Exception/Error
at sun.security.ssl.Handshaker.checkThrown(Unknown Source)
at sun.security.ssl.SSLEngineImpl.checkTaskThrown(Unknown Source)
at sun.security.ssl.SSLEngineImpl.readNetRecord(Unknown Source)
at sun.security.ssl.SSLEngineImpl.unwrap(Unknown Source)
at javax.net.ssl.SSLEngine.unwrap(Unknown Source)
.....
Caused by: java.lang.UnsupportedOperationException
at ....RTMPSTrustManager.getAcceptedIssuers(....)

愚かな私は、以下にこのコードがあるので、「Caused by」というフレーズに気付くべきだったので、JRE 1.7.4以降、 getAcceptedIssuers() 内で例外をスローすると、その問題が発生するようです。例外をスローするのではなく、代わりに null を返すことになりました。1.7.4 以降の問題がこの修正 (http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7142172) に関連しているかどうかはわかりませんが、実際には関連しているようです。

public java.security.cert.X509Certificate[] getAcceptedIssuers()
    {
        return null;
        //throw new UnsupportedOperationException();
    }

お待ち頂きまして、ありがとうございます

于 2012-10-11T16:21:46.677 に答える