2010-08-21 116 views
7

我想編譯從另一個開發人員SVN簽出的代碼。 Eclipse最近給我帶來了很多麻煩。Eclipse不會編譯,錯誤的類文件,錯誤的版本

這裏是我特殊的項目設置: alt text

這是我的螞蟻文件的編譯部分:

<target name="compile" depends="build-common, init" description="Compile files. "> 
    <javac srcdir="${src_dir}" destdir="${build_dir}" debug="true" > 
     <classpath path="${tomcat_home}/lib/servlet-api.jar;" /> 
    </javac> 
</target> 

當我編譯(使用Ant)我得到一個錯誤信息:

compile: 
    [javac] Compiling 3 source files to H:\MYCOMPANY\portlets\build 
    [javac] H:\MYCOMPANY\portlets\src\com\mycompany\portlets\CourseList.java:3: cannot access java.io.IOException 
    [javac] bad class file: C:\Program Files\Java\jre1.6.0_07\lib\rt.jar(java/io/IOException.class) 
    [javac] class file has wrong version 49.0, should be 48.0 
    [javac] Please remove or make sure it appears in the correct subdirectory of the classpath. 
    [javac] import java.io.IOException; 
    [javac]    ^
    [javac] 1 error 

這個錯誤是什麼意思?

回答

13

49.0的類文件版本屬於Java 1.5.x,而48.0的屬於Java 1.4.x版本之一。由於在Java語言規範中引入了一些新功能和更改,因此1.5中的類文件結構發生了變化。

從錯誤中,可以推斷出預計會有Java 1.4類文件,而發現Java 1.5類文件。看起來編譯器是Java 1.4編譯器,因此您應該嘗試驗證您是否使用了正確版本的Java編譯器以及正確的JDK(即JDK主目錄)。

附錄

螞蟻傾向於尋找在$ JAVA_HOME /斌/的javac javac的可執行文件。如果JAVA_HOME環境變量設置不正確,請對Java 1.4家庭進行說明,那麼即使在Eclipse中也有可能獲得所描述的錯誤。

附錄#2

添加條目到PATH環境變量可能導致在改變螞蟻的搜索類路徑行爲,這可能導致不同的tools.jar被用於編譯的目的來源。這可能是由於JRE 1.4.2安裝中的jvm.dll被用於運行Eclipse(以及Ant)。

+0

如何檢查Ant編譯器版本? – 2010-08-23 21:19:42

+0

那麼,默認情況下,這往往是JDK主頁中編譯器的版本(Eclipse啓動配置可以幫助識別主目錄)。你可以使用javac Ant任務的可執行屬性指定不同的編譯器:http://ant.apache.org/manual/Tasks/javac.html – 2010-08-23 21:37:15

+0

我不明白,我使用Java 1.6 JDK。我添加了一個截圖到我的文章。爲什麼要這麼做? – 2010-08-23 21:58:20

3

糟糕的類文件:C:\ Program Files文件\的Java \ jre1.6.0_07 \ LIB \ rt.jar中(Java/IO/IOException.class)
類文件中有錯誤的版本49.0,應該是48.0

這說明所提到的類文件是使用編譯器編譯的,該編譯器生成49.0版的類文件,而ant期望使用編譯器編譯生成48.0版的類文件。由於有問題的類是JRE的一部分,因此您需要更新build.xml中的類路徑以包含包含版本爲48.0的類文件的JRE。

+1

嗯,Java 6的有50.0類文件版本。 – 2010-08-21 00:33:46

+0

@Vineet:恩,你說得對。我只是從錯誤信息翻譯。但是這並不能解釋爲什麼JRE 1.6中的'IOException.class'具有版本49.0,如錯誤消息中所述?無論如何,我通過刪除特定JRE版本來回答我的答案。 – BalusC 2010-08-21 00:39:53

+0

好抓。版本49.0在1.6 JRE中沒有任何意義。 – 2010-08-21 00:55:59

2

您似乎正在使用版本1.5 java編譯器運行Ant,但是針對1.6安裝的類庫(rt.jar)進行編譯。你應該設置你的build.xml,以便它能夠一致地使用同一個java版本的兩個(編譯器和類庫)。

+0

這可能是問題,我在哪裏指定?在ant build中,我應該在編譯命令中添加target =「1.5」source =「1.5」嗎? – 2010-08-23 20:17:44

+0

它位於您的「外部工具配置」中,即每個螞蟻啓動器。特別是檢查JRE和Classpath選項卡。問題可能在於JRE設置,但是您可能已經手動向Classpath添加了不同版本的rt.jar。 – Stroboskop 2010-08-24 11:18:57

+0

不知道他們如何設法做到這一點? – 2010-08-28 13:30:55

3

首先,您的項目設置與您的構建腳本無關。項目設置告訴你Eclipse如何構建你的項目,而不是你的ant文件將如何運行。

要找到下的JVM,Ant運行時,單擊鼠標右鍵構建腳本在Eclipse中,選擇「運行方式...」。在彈出的對話框中,導航到jvm選項卡​​並檢查哪個jre用於運行腳本。

+1

這對此有所幫助。沒有JVM選項卡,但JRE選項卡正確使用jre1.6.0_07。 – 2010-08-24 18:50:11

+1

對不起,我沒有打開Eclipse並給出了錯誤的標籤名稱。那麼,接下來我會檢查: 1.如果你有任何地方安裝了jre 1.4。 2.如果您定義了JAVA_HOME或JRE_HOME,並且它們指向的位置是。 3.從命令行運行java -version,查看您的路徑指向哪個java。如果它是1.4,請將您的路徑環境調整到1.6。 – spbfox 2010-08-24 19:25:51

0

也許你需要使用JDK JRE它位於C:\ Program Files文件\的Java \ jdk的\ jre的,不公開

1

你可以嘗試從jdk/jre複製tools.jar到tomcat的common/lib

它爲我所證實here

+0

它工作4我thnx – Mariah 2017-10-25 14:55:43

2

錯誤消息意味着,包括在Ant使用tool.jar是舊版本比它嘗試編譯的類編譯器工具。 消息「[javac] class file has wrong version 50.0 should 49.0」意味着您的類文件需要jdk 6.0,但是您的tool.jar來自jdk 5.0發行版。在eclipse中打開Window> Preferences> Ant> Runtime> Global Entries來切換到正確的tools.jar。

0

您需要更改ANT的Java版本,因爲如果您將運行時環境用作JDK1.8,那麼您的ANT應該指向相同的版本,否則Ant應該從JDK1.8/lib/tools.jar位置。 要解決這個問題,我的你的Eclipse轉到窗口 - >首選項 - > Ant - >運行時 - >全局條目。這裏檢查並更新tools.jar路徑與最新版本如下: C:\ Program Files \ Java \ jdk1.8.0_60 \ lib \ tools.jar

然後運行您的構建腳本問題將得到解決。 :)

0

改變在Eclipse中的tools.jar固定它正確的版本。 我使用JRE 1.6,不得不改變它使用1.8來獲取類文件版本52.