2012-10-11 43 views
1

我剛剛嘗試過擴展SocketChannel,但似乎SocketChannel從JRE 1.7.4開始提供了一些新的API方法(http://openjdk.java.net/projects/nio/javadoc/爪哇/ NIO /渠道/ SocketChannel.html),問題是,如果我實現這些方法,我的JAR會引發以下錯誤,每當我使用Java 1.6在JRE中擴展SocketChannel 1.7.4+

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

現在我想通了,爲什麼會出現相關的錯誤到的 「java/NIO /渠道/ NetworkChannel」,似乎一個SocketChannel接口NetworkChannel開始在JRE 1.7

現在,當我使用JRE 1.7.4+,一些運行時錯誤OC小人,居然奇怪的是,即使我有這些新的API方法實現,那麼我得到運行時錯誤,當我稱之爲「解包」的方法

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

如何使我的JAR與JRE 1.6和1.7兼容,同時還擴展了SocketChannel類?

+0

您有一些stacktrace嗎?通常,使用比開發JDK更新的JRE應該沒有問題。 – Fildor

+0

如果我在JRE 1.6編譯JAR,然後在JRE 1.7中運行它沒有實施新的方法我收到以下錯誤 異常的線程「主題-27」了java.lang.RuntimeException:委託任務扔異常/錯誤 \t在陽光下.security.ssl.Handshaker.checkThrown(未知來源) \t在sun.security.ssl.SSLEngineImpl.checkTaskThrown(未知來源) \t在sun.security.ssl.SSLEngineImpl.readNetRecord(未知來源) \t在sun.security .ssl.SSLEngineImpl.unwrap(Unknown Source) \t at javax.net.ssl.SSLEngine.unwrap(Unknown Source) –

+0

你可以添加一些代碼嗎?這對我來說沒有任何意義,真的。 – Fildor

回答

1

好吧,好像我已經指出了關於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,如果我在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(); 
    } 

感謝您的耐心等待

+1

從該方法返回空值無效。檢查Javadoc。至少你應該返回一個空數組,但如果這是臭名昭着的信任 - 任何人TrustManager你應該把它扔掉,讓你的證書工作。這是從根本上不安全,不被納入新的代碼。 – EJP

+0

好的謝謝,我會這樣做 –