歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Eclipse問題Access restriction: The type SunJCE is not API 解決

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

日期:2017/2/28 13:47:55   编辑:Linux教程

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 Files\Java\jdk1.7.0_79\jre\lib\ext\sunjce_provider.jar')

經探索發現了一個解決方法。從報錯信息中可以看出我使用的Java Runtime Environment(Java運行環境,簡稱jre)是D:\Program Files\Java\jdk1.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 Files\Java)為例,在E:\Program Files\Java\jdk1.6.0_22\目錄下有一個JRE,在C:\Program Files\Java\目錄下也有一個JRE。為什麼會有兩套JRE呢?因為JDK裡面的工具也是用JAVA編寫的,它們本身運行的時候也需要一套 JRE,即E:\Program Files\Java\jdk1.6.0_22\目錄下的JRE。而E:\Program Files\Java\目錄下的JRE是用來執行我們自己編寫的JAVA程序。當然,兩套JRE中的任何一套都可以用來執行我們自己編寫的JAVA程序, 但是JDK裡面的工具只能由E:\Program Files\Java\jdk1.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_MACHINE\Software\JavaSoft\Java 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 Files\Java\jdk1.5.x\jre\bin,會看到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

Hadoop Eclipse 插件編譯安裝1.2.0 http://www.linuxidc.com/Linux/2013-07/87428.htm

Hadoop在Eclipse中的插件編譯 http://www.linuxidc.com/Linux/2013-04/83295.htm

Hadoop 1.2.1編譯Eclipse插件 http://www.linuxidc.com/Linux/2013-10/91666.htm

如何在Ubuntu 14.04中安裝最新版Eclipse http://www.linuxidc.com/Linux/2014-08/105090.htm

Eclipse 的詳細介紹:請點這裡
Eclipse 的下載地址:請點這裡

Copyright © Linux教程網 All Rights Reserved