1. 程式人生 > >eclipse/myeclipse/intellij匯入專案的各種問題的解決

eclipse/myeclipse/intellij匯入專案的各種問題的解決

出現java.lang.UnsupportedClassVersionError 錯誤的原因

出現java.lang.UnsupportedClassVersionError 錯誤的原因,是因為我們使用高版本的JDK編譯的Java class檔案試圖在較低版本的JVM上執行,所報的錯誤。

因為,高版本的JDK生成的class檔案使用的格式,可能與低版本的JDK.class檔案格式不同。這樣,低版本的JVM無法解釋執行這個.class檔案,會丟擲java.lang.UnsupportedClassVersionError不支援的Class版本錯誤。

這個錯誤尤其在JDK5JDK5之前的版本上表現明顯。因為,JDK5

Java語法上作了不少增強,引入了一些新的.class檔案的元素,導致舊版本的JVM無法解釋、執行.class檔案。即使這個類並沒有使用任何JDK5的新元素,但是JDK5生成的.class檔案,JDK1.4及其以前的JVM都無法辨認!

所以,目前使用最廣的,還是JDK1.4。很多軟體和專案都無法使用JDK5

有一個名叫 Toby Reyelts 的開發人員決定消除 JDK 5.0 編譯器限制。結果就是開放原始碼的 Retroweaver 專案(參見參考資料)。Retroweaver 使用 classworking 技術來修改由 JDK 5.0 編譯器生成的二進位制類表示,以便這些類可以與早期的 JVM 

一起使用。

它通過修改JDK5生成的.class檔案,將其變為JVM1.4及之前版本能夠執行的.class檔案。

目前,使用新版本的IDE編輯器可能會造成你遭遇java.lang.UnsupportedClassVersionError 錯誤。

比如,Eclipse3.2+MyEclipse5.0這個新版的IDE工具。進入首選項---Java---編譯器,可以看到,預設的編譯器依從等級是5.0,這裡改為1.4,因為我們使用的軟體需要執行在JDK1.4JVM上。

同一配置區下的已安裝JRE中,不要安裝JRE,而是安裝JDK,指定1.41.5JDK。還是使用jdk1.4

MyEclipse----

應用伺服器下,指定Tomcat5。指定Tomcat使用jdk1.4

這樣,就全部指定使用Jdk1.4來編譯和執行程式了。如果全部指定jdk5也是可以的。但是,絕對不能夠使用jdk5編譯程式,而又在jdk1.4上執行程式,那樣將會丟擲java.lang.UnsupportedClassVersionError不支援的Class版本錯誤。

這種情況下,不論是Eclipse生成的war包,還是ant檔案生成war包,都使用jdk5編譯,就會在執行時出現錯誤,該應用程式將無法啟動。如果你檢視Tomcat的日誌檔案,將會看到正是java.lang.UnsupportedClassVersionError錯誤發生了!

一般出現在從別處import的專案上,只有專案資料夾上有紅叉,其他地方都正常,現總結個人的幾個解決方案:
有幾種可能:
1,編碼設定是否一致,也即是你專案原來的編碼和現在eclipse用的預設編碼是否一致

*** 設定workspace編碼 General-->Workspace-->Text file encoding UTF-8***

2,匯入專案中jar路徑可能已經被改變,多數情況下都是這個原因造成,我也曾經遇見過,你要確保你的jar包路徑都沒問題。myeclipse有檢視jar路徑的檢視你可切換看看,報紅X的就都是路徑被改動過的,重新加進來就OK。

3,在problem控制檯裡有如下錯誤提示:Java compiler level does not match the version of the installed Java project facet。這種情況一般可以在專案上右鍵-->properties-->然後找到project facets和 Java Compiler兩個選項,修改其使用的jdk版本即可。如果沒有找到project facets選項,可以參考下面的方法:


當你安裝了兩個版本的JDK,用了兩個IDE開發工具,比如兩個myeclipse,Myeclipse8.5和Myeclipse9.0。


這時候涉及到了jdk版本的問題,而在Myeclipse中設定是比較隱藏的。
Eclipse下有個專案報如上錯誤,這個是因為Facted Project 中的Java 版本設定與專案的Java 版本設定不一致。而如果使用的是MyEclipse的話,這個配置修改起來就不是很方便,具體方法稍後再說。如果是eclipse jee版本,則使用javaee外掛是wtp,在wtp環境在,在當前專案上點右鍵,屬性--Project Facets中,配置編譯版本與java compiler的版本一致,問題即解決了。
MyEclipse中沒有Project Facets配置選項,則需要到當前專案的.settings資料夾下,找到org.eclipse.wst.common.project.facet.core.xml檔案,其內容如下:
<?xml version="1.0" encoding="UTF-8"?>
<faceted-project>
<fixed facet="wst.jsdt.web"/>
<installed facet="java" version="1.6"/>
<installed facet="jst.web" version="2.5"/>
<installed facet="wst.jsdt.web" version="1.0"/>
</faceted-project>

其中<installed facet="java" version="1.6"/>這行就是faceted project的編譯級別配置。<installed facet="jst.web" version="2.5"/>這行配置在某些情況下也需要修改,比如在MyEclipse中建了個web專案,後來又匯入到eclipse jee,有時候就需要修改這個配置。

在MyEclipse中編寫Java程式碼時,用到了BASE64Decoder,import sun.misc.BASE64Decoder;可是Eclipse提示: 
Access restriction : The type BASE64Decoder is not accessible due to restriction on required library C:\Program 
files\java\jre6\lib\rt.jar 
Access restriction : The constructor BASE64Decoder() is not accessible due to restriction on required library C:\Program files\java\jre6\lib\rt.jar 

解決方案1(推薦):
只需要在project build path中先移除JRE System Library,再新增庫JRE System Library,重新編譯後就一切正常了。 
解決方案2:
Windows -> Preferences -> Java -> Compiler -> Errors/Warnings -> 
Deprecated and trstricted API -> Forbidden reference (access rules): -> change to warning