2012-10-31 56 views
6

我從後面一些代碼在2003年的工作還有就是下面的類的引用:遺留Java代碼使用com.sun.net.ssl.internal.ssl.Provider()的

new com.sun.net.ssl.internal.ssl.Provider() 

這導致了一個錯誤:

Access restriction: The type Provider is not accessible due to restriction on required library /Library/Java/JavaVirtualMachines/1.7.0.jdk/Contents/Home/jre/lib/jsse.jar

有沒有人有一個合適的替代使用這個類有什麼建議?

+0

我不知道那個班,但我可以讀'ssl'。如果這是安全套接字層,請考慮[javax.net.ssl。*](http://docs.oracle.com/javase/7/docs/api/javax/net/ssl/package-summary.html) – ignis

+2

有很少有任何理由像這樣手動實例化提供程序。什麼是代碼? – Bruno

回答

2

您可以在Eclipse首選項Java->Compiler->Errors/Warnings->Deprecated and restricted API中將其變爲警告或非事件。請注意,正如其他人所說的那樣,這不是最佳實踐,當您有其他選擇時應該避免。

+1

是的,你可以,但你通常不應該,至少不是全球性的。 – sleske

+0

爲什麼投下來?這是處理遺留代碼的可行方式 –

+0

作爲一般性建議,我覺得它很危險。作爲臨時解決方案,它可以。我喜歡你的編輯並刪除了downvote。 – sleske

6

大多數情況下,您並不需要自己創建或獲取提供者實例。正如Oracle Providers documentation說:

General purpose applications SHOULD NOT request cryptographic services from specific providers. That is:

getInstance("...", "SunJCE"); // not recommended 
    vs. 
getInstance("...");   // recommended 

此外,只要有一個爲供應商過載的參數,它往往需要一個字符串或一個實例,但字符串(名稱)可能會更普遍。 (有時候傳遞一個實例可能會很有用,例如對於某些PKCS#11配置,但這是不尋常的。)

JCA documentation about Providers應該是有用的。

如果您確實想要了解特定實例,則可以使用Security.getProvider(name)。您可以在提供商文檔中找到適當的名稱。

3

把這行代碼扔掉。也請丟棄對com.sun.net.ssl包及其子包的任何引用:修復導入,以便它們引用javax.net.ssl.中的類

這是JDK 1.4之前的代碼,從JSSE單獨下載的日子開始。