eclipse/myeclipse/intellij匯入專案的各種問題的解決
出現java.lang.UnsupportedClassVersionError 錯誤的原因
出現java.lang.UnsupportedClassVersionError 錯誤的原因,是因為我們使用高版本的JDK編譯的Java class檔案試圖在較低版本的JVM上執行,所報的錯誤。
因為,高版本的JDK生成的class檔案使用的格式,可能與低版本的JDK的.class檔案格式不同。這樣,低版本的JVM無法解釋執行這個.class檔案,會丟擲java.lang.UnsupportedClassVersionError不支援的Class版本錯誤。
這個錯誤尤其在JDK5與JDK5之前的版本上表現明顯。因為,JDK5
所以,目前使用最廣的,還是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.4的JVM上。
同一配置區下的已安裝JRE中,不要安裝JRE,而是安裝JDK,指定1.4或1.5的JDK。還是使用jdk1.4。
在MyEclipse----
這樣,就全部指定使用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