Java 在JRE 1.7.4和x2B中扩展SocketChannel;
我刚刚尝试扩展SocketChannel,但似乎从JRE 1.7.4开始,SocketChannel有了一些新的API方法(http://openjdk.java.net/projects/nio/javadoc/java/nio/channels/SocketChannel.html),问题是,如果我实现了这些方法,每当我使用Java1.6时,我的JAR就会抛出以下错误Java 在JRE 1.7.4和x2B中扩展SocketChannel;,java,Java,我刚刚尝试扩展SocketChannel,但似乎从JRE 1.7.4开始,SocketChannel有了一些新的API方法(http://openjdk.java.net/projects/nio/javadoc/java/nio/channels/SocketChannel.html),问题是,如果我实现了这些方法,每当我使用Java1.6时,我的JAR就会抛出以下错误 Exception in thread "Thread-24" java.lang.NoClassDefFoundError
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”方法时,也会出现运行时错误
在这一行中,我只调用sslEngine.unwrap方法,所以简而言之,当我实现了新的API方法时,它只适用于JRE 1.7.0到1.7.3
如何使我的JAR与JRE 1.6和1.7兼容,同时扩展SocketChannel类?好的,似乎我已经指出了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(....)
愚蠢的我,我应该注意到“由引起”这个短语,因为我下面有这段代码,所以从JRE 1.7.4开始,如果我在getAcceptedAssuers()中抛出一个异常,那么我就会遇到这个问题,所以我只是没有抛出一个异常,而是返回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();
}
感谢您的耐心好的,我似乎已经指出了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(....)
愚蠢的我,我应该注意到“由引起”这个短语,因为我下面有这段代码,所以从JRE 1.7.4开始,如果我在getAcceptedAssuers()中抛出一个异常,那么我就会遇到这个问题,所以我只是没有抛出一个异常,而是返回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();
}
谢谢你的耐心你有什么建议吗?通常,拥有一个比Development-JDK更“新”的JRE应该没有问题。如果我在JRE 1.6中编译JAR,然后在JRE 1.7中运行它,而没有实现新方法,那么我在线程“thread-27”java.lang.RuntimeException中得到以下错误异常:委派任务在sun.security.ssl.Handshaker.checkThrown处抛出异常/错误(未知源)在sun.security.ssl.SSLEngineImpl.CheckTaskSwink(未知源)在sun.security.ssl.SSLEngineImpl.readNetRecord(未知源)在sun.security.ssl.SSLEngineImpl.unwrap(未知源)在javax.net.ssl.SSLEngine.unwrap(未知源)可以添加一些代码吗?这对我来说真的没有任何意义。@Code.Blodded-这是整个堆栈跟踪吗?我根本不引用任何网络通道这里是标记为@Override public SocketChannel shutdownOutput()抛出IOException{return SocketChannel.shutdownOutput();}的方法的示例实现你有什么线索吗?通常,拥有一个比Development-JDK更“新”的JRE应该没有问题。如果我在JRE 1.6中编译JAR,然后在JRE 1.7中运行它,而没有实现新方法,那么我在线程“thread-27”java.lang.RuntimeException中得到以下错误异常:委派任务在sun.security.ssl.Handshaker.checkThrown处抛出异常/错误(未知源)在sun.security.ssl.SSLEngineImpl.CheckTaskSwink(未知源)在sun.security.ssl.SSLEngineImpl.readNetRecord(未知源)在sun.security.ssl.SSLEngineImpl.unwrap(未知源)在javax.net.ssl.SSLEngine.unwrap(未知源)可以添加一些代码吗?这对我来说真的没有任何意义。@Code.Blodded-这是整个堆栈跟踪吗?我根本不引用任何网络通道这里是标记为@Override public SocketChannel shutdownOutput()抛出IOException{return SocketChannel.shutdownOutput();}的方法的示例实现从该方法返回null无效。检查Javadoc。至少,您应该返回一个空数组,但是如果这是臭名昭著的trust Anywhere TrustManager,那么您应该将其扔掉,让您的证书正常工作。它是非常不安全的,不能被合并到新代码中。从该方法返回null是无效的。检查Javadoc。至少,您应该返回一个空数组,但是如果这是臭名昭著的trust Anywhere TrustManager,那么您应该将其扔掉,让您的证书正常工作。它从根本上是不安全的,不能被合并到新代码中。