首頁 > 軟體

Eclipse問題Access restriction: The type 'SunJCE' is not API 解決

2020-06-16 17:30:03

Eclipse問題Access restriction: The type ‘SunJCE’ is not API 解決,並加深理解/jre與/jdk目錄下jre的區別

今天寫程式的時候遇到了一個編譯問題

Access restriction: The type 'SunJCE' is not API (restriction on required library 'D:Program FilesJavajdk1.7.0_79jrelibextsunjce_provider.jar')

經探索發現了一個解決方法。從報錯資訊中可以看出我使用的Java Runtime Environment(Java執行環境,簡稱jre)是D:Program FilesJavajdk1.7.0_79下的jre,

點選Project -> Properties,選擇Java Build Path下的Libraries,可以看到我們執行工程時使用的jre,

選擇JRE System Library,然後Remove掉,接下來再選擇Add Library,在彈框中選擇JRE System Library,點選next,

在接下來的選擇框中我們可以看到三個選項,分別為

Execution environment 它提供了eclipse支援的所有執行環境選項

Alternate JRE 可替換的JRE,在下拉選項中提供了../Java/jre7與../Java/jdk1.7.0_79/jre兩個執行環境可選

Workspace default JRE(jre7)可知Java工作環境預設的jre為../Java/jre7

如果我選擇Workspace default JRE(jre7)或Alternate JRE 下的jre7,都可以講我原來的jre環境從../Java/jdk1.7.0_79/jre更換為../Java/jre7。


對於Access restriction: The type ‘SunJCE’ is not API這個問題,只要按照以上過程,先remove掉jre再新增jre就可以解決問題,(由此可推斷這個報錯應該是Eclipse造成的)


接下來,再了解一下Java中的兩個jre的作用

以下內容來自http://blog.sina.com.cn/s/blog_7ffb8dd501011sgc.html


1、jdk下bin目錄裡的java.exe與外部jre中的java.exe的秘密
jdk裡的java.exe和jre中的java.exe其實是一樣的,但我們在執行的時候用的卻是優先使用外部jre中的java.exe(即使我們安裝了JDK且也設定了環境變數)。
首先,我們看下JDK的安裝過程中發生了什麼事:
安裝JDK時一定會在其子目錄下面安裝一個JRE,同時在安裝的過程也會詢問你是否要安裝一 個外部的JRE。如果我們選擇安裝則就同時擁有了兩個jre。這兩個JRE其實本質上是沒有任何分別的。最主要的區別在於:JDK目錄裡面的JRE主要是 設計用來執行JDK自帶的那些工具的(Bin目錄下)。而外部的JRE在安裝的時候會自動註冊到作業系統的path(但在 我的電腦屬性高階系統設定環境變數系統變數中的 path中並沒有包含該命令的路徑值)裡面一般是:System32資料夾下 (該資料夾下包含:java.exe javaw.exe javaws.exe 三個檔案)面。因此我們只要安裝了外部的JRE(即使JDK沒有安裝,環境變數沒有設定)則執行Java程式時都是用的外部JRE的java.exe程式來執行的(即使安裝了JDK且設定了環境變數)(系統的預設path具有優先)。
2、
簡單的說JDK是面向開發人員使用的SDK 。SDK是Software Development Kit 一般指軟體開發包,可以包括函數庫、編譯程式等。
JDK(JAVA Develop Kit,JAVA開發工具包)提供了Java的開發環境和執行環境,主要用於開發JAVA程式,面向Java程式的開發者;
JRE(JAVA Runtime Environment,JAVA執行環境)提供了Java的執行環境,主要用於執行JAVA程式,面向Java程式的使用者。
一般情況下,每個JDK裡面包含兩套JRE。以JDK jdk1.6.0_22(預設安裝路徑是E:Program FilesJava)為例,在E:Program FilesJavajdk1.6.0_22目錄下有一個JRE,在C:Program FilesJava目錄下也有一個JRE。為什麼會有兩套JRE呢?因為JDK裡面的工具也是用JAVA編寫的,它們本身執行的時候也需要一套 JRE,即E:Program FilesJavajdk1.6.0_22目錄下的JRE。而E:Program FilesJava目錄下的JRE是用來執行我們自己編寫的JAVA程式。當然,兩套JRE中的任何一套都可以用來執行我們自己編寫的JAVA程式, 但是JDK裡面的工具只能由E:Program FilesJavajdk1.6.0_22目錄下的JRE來執行。
既然在我們的電腦裡面至少有兩套JRE(如果安裝了Borland JBuilder等高階開發工具,電腦裡面會有更多套的JRE),那麼由誰來決定使用哪一套JRE呢?這個重擔就落在java.exe的身上。(當然對於 1 中我們安裝了JDK的情況下,預設就是外部的JRE執行了!!!)
當我們在命令列輸入:
java xxx
的時候,java.exe的任務就是在我們電腦上眾多的JRE中找到合適的JRE來執行xxx。java.exe依據以下順序來尋找JRE:
(1)自己的目錄下有沒有JRE目錄;
(2)父目錄下有沒有JRE目錄;
(3)查詢登錄檔HKEY_LOCAL_MACHINESoftwareJavaSoftJava Runtime Environment
所以java.exe的執行結果與我們電腦裡哪一個java.exe(搜尋一下就會發現我們電腦裡面也不止一個java.exe)被執行以及哪套JRE來執行JVA程式有很大的關係。
另外,java.exe在找到合適的JRE以後,還有一個驗證版本的程式,也就是java.exe與JRE的版本一致才可以執行。如果出現版本不一致的問題,一定要記得兩件事情:
(1)哪一個java.exe被執行;
(2)java.exe找到哪一套JRE。
只要這兩件事情確定了,我們就抓住了問題的來龍去脈,解決起來也就輕而易舉了。
3、
JVM(JAVA Virtual Machine,JAVA虛擬機器)是JRE的一部分,JRE是JVM的補充。那麼JVM到底在哪裡呢?我們開啟C:Program FilesJavajdk1.5.xjrebin,會看到client和server兩個目錄,在這兩個目錄中分別可以看到jvm.dll,這就 是我們所說的JVM之所在。


補充:
jdk的jre目錄下的Bin目錄有兩個目錄:server與client。這就是真正的jvm.dll所在。 jvm.dll無法單獨工作,當jvm.dll啟動後,會使用explicit的方法(就是使用Win32 API之中的LoadLibrary()與GetProcAddress()來載入輔助用的動態連結庫),而這些輔助用的動態連結庫(.dll)都必須位於jvm.dll所在目錄的父目錄之中。因此想使用哪個JVM,只需要設定PATH,指向JRE所在目錄底下的jvm.dll

Ubuntu 15.04中使用Eclipse 4.4、Java 8以及WTP  http://www.linuxidc.com/Linux/2016-04/129821.htm

Ubuntu 16.04安裝Eclipse http://www.linuxidc.com/Linux/2016-07/133482.htm

Ubuntu 14.04 LTS安裝Java 8和Eclipse 4.4  http://www.linuxidc.com/Linux/2014-11/109217.htm


IT145.com E-mail:sddin#qq.com