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 を作成するにはどうすればよいですか?