java - development - jdk version 52




如何修復java.lang.UnsupportedClassVersionError:不支持的major.minor版本 (20)

我正在嘗試使用Notepad++作為我的所有功能於一身的工具編輯,運行,編譯等。

我安裝了JRE ,並將路徑變量設置為... / bin目錄。

當我在Notepad ++中運行“Hello world”時,出現以下消息:

java.lang.UnsupportedClassVersionError: test_hello_world :
 Unsupported major.minor version 51.0
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClassCond(Unknown Source)
       .........................................

我認為這裡的問題是關於版本的; 某些版本的Java可能會老舊或太新。

  1. 我如何解決它?
  2. 我應該安裝JDK,並將我的路徑變量設置為JDK而不是JRE?
  3. JRE或JDK中的PATH變量有什麼區別?

我如何解決它?

此錯誤意味著用於執行類代碼的JRE無法識別所使用的Java版本。 通常是因為生成類文件(即編譯它)的Java版本更新。

要修復它,你也可以

a)使用與運行它相同或較舊版本的Java編譯器編譯Java源代碼。 即安裝適當的JDK。

b)使用較新版本的Java編譯器編譯Java源代碼,但採用兼容模式。 即使用-target參數。

c)在與JDK用於編譯類相同或更新版本的JRE中運行編譯後的類。

您可以使用javac -version編譯器來檢查當前使用的版本,而運行時可以使用java -version

我應該安裝JDK,並將我的PATH變量設置為JDK而不是JRE?

當然,對於編譯,請安裝並配置所需的特定JDK。

對於運行時,您可以使用JDK或獨立JRE自帶的驅動程序,但無論如何,請確保您已安裝正確的版本,並且已配置PATH,以免出現意外。

JRE或JDK中的PATH變量有什麼區別?

PATH環境變量告訴命令shell在何處查找您輸入的命令。 當您鍵入java ,命令解釋程序將從左到右瀏覽PATH變量中指定的所有位置,以找到適合運行的java運行時可執行文件。 如果您安裝了多個Java版本 - 即您在PATH變量中指定了多個位置的java可執行文件,則從左向右執行時遇到的第一個版本將是執行的版本。

編譯器命令是javac ,只有JDK自帶。 運行時命令是java並隨JDK一起提供,並位於JRE中。

您可能已經安裝了一個版本(51.0 = Java 7),並且您也安裝了相同版本的java ,但是之前的另一個java版本出現在PATH的早期版本中,因此正在調用而不是你期望的一個。


java.lang.UnsupportedClassVersionError是由於在編譯期間JDK較高而JDK在運行時較低而發生的。


別擔心,我解決了它。

其實很簡單 - 你需要安裝相同版本的BREH JRE / JDK。

JRE 6 - > JDK 6

JRE 7 - > JDK 7

等等。


另一種解決方法是在Mac OS X上安裝Homebrew ,這是:

brew install Caskroom/cask/java

在Eclipse中,我剛剛進入菜單命令窗口 - > 首選項 - > Java - > 編譯器 ,然後將“編譯器合規性級別”設置為1.6。


在Eclipse的菜單窗口 - > 首選項 - > Java - > 編譯器中選中“配置項目特定設置”。

如果你仍然有相同的Java版本的錯誤:嘗試手動刪除項目的生成文件夾。 然後重新啟動Eclipse。


如果您在使用Maven時遇到此問題,可以使用插件Maven Compiler交叉編譯您的代碼。

 <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.1</version>
                <configuration>
                    <source>1.6</source>
                    <target>1.6</target>
                </configuration>
            </plugin>
       .....

更新:如果您使用的是JDK 8,請將sourcetarget設置為1.8


從Eclipse運行Ant時出現相同的錯誤消息,但這裡提到的其他解決方案並未解決我的問題。 有趣的是,從Windows命令行運行Ant運行良好,所以它必須是Eclipse中的配置問題。

事實證明,在Eclipse中,您可以指定Ant應該運行的環境,並將其設置為JRE而不是JDK。

  • 轉到:運行 - >外部工具 - >外部工具配置...
  • 為您的項目選擇Ant build.xml(如果您有多個項目)
  • 激活選項卡'JRE'
  • 這裡被選中'獨立JRE:jre6'。 當我將其改為1.6或1.7系列的JDK時,錯誤消失了。

您已經使用JDK 7編譯了Java類,並且正在嘗試在JDK 6上運行相同的類。


您已經使用更高版本的JDK進行編譯並嘗試從較低版本的JDK / JRE

要檢查這一點,請參閱版本信息:

javac -version

java -version

它們會有所不同,並且javac會有更高的版本號。

為了解決這個問題,從JDK版本運行java,或者如果你有一個更新的JRE / JDK,它也可以工作。

which javac會告訴你位置,例如/usr/bin/javac 。 只需直接使用/usr/bin/java <program>

或者您可以將環境變量設置為永久解決方案。


您的Java文件使用與嘗試運行它的版本(較低的運行時版本)不同的版本(較高的編譯器版本)進行編譯。

這是基本的理解,用較低版本編譯的類預計在較高版本中運行。 但是相反(編譯時使用更高的編譯器版本,並嘗試使用更低的運行時版本運行它)有時是不可能的。

因此,當你試圖執行你的程序時,你會看到這個錯誤。 不受支持的major.minor版本xx

問:我已經在Java 7中創建了一個應用程序,但是當我的用戶嘗試運行它時,他們得到了不受支持的major.minor版本51.0錯誤。 這是什麼意思,我能做些什麼呢?

答:如果您在Java 7中使用javac編譯應用程序,則生成的類文件將具有51.0版本號。 7之前的Java版本無法識別此編號,因此用戶在運行應用程序之前必須升級到Java 7。 如果您沒有使用任何Java 7 API,則可以嘗試使用javac -target 1.6編譯您的應用程序以創建一個1.6兼容的類文件。 如果您的應用程序使用webstart進行部署,則可以指定所需的最低版本。 有關更多信息,請參閱此處有關Java Web Start和JNLP的文檔。 一旦我們觸發了自動更新到Java 7的最終用戶,他們的桌面上當前擁有Java 6,這個問題就會消失。 時間表尚未確定,我們希望開發人員有時間首先解決其代碼與JDK 7之間的任何問題。

(來源: oracle.com 。)


我在Mac上有類似的情況,下面的過程對我有用:

在終端中輸入

vi ~/.profile

然後在文件中添加這一行,並保存

export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk<version>.jdk/Contents/Home

版本是計算機上的版本,例如1.7.0_25

退出編輯器,然後輸入以下命令使其生效

source ~/.profile 

然後輸入java -version來檢查結果

java -version 

什麼是.profile文件?

.profile文件是一個隱藏文件。 它是一個可選文件,告訴系統當其用戶的配置文件登錄時要運行哪些命令。例如,如果我的用戶名是bruno,並且/ Users / bruno /中有一個.profile文件,則其所有內容將在登錄過程中執行。

資料來源: http://computers.tutsplus.com/tutorials/speed-up-your-terminal-workflow-with-command-aliases-and-profile--mac-30515 : http://computers.tutsplus.com/tutorials/speed-up-your-terminal-workflow-with-command-aliases-and-profile--mac-30515


我解決了它。 我跑了:

JAVA_HOME=/usr/lib/jvm/java-7-openjdk-i386

錯誤是誤導, Unsupported major.minor version 51.0 。 這給人的印像是不支持版本51(Java 7)。 我們應該使用Java 6。

錯誤應該是:

當前的Java版本50不受支持。 改用Java版本7(51:0及更高版本)


我遇到了這個問題,我不得不從命令行運行一個Maven編譯來運行我的單元測試; 如果我對測試類進行了更改並讓Eclipse自動重新編譯它,那麼我得到了“Unsupported major.minor version 51.0”錯誤。

我確實安裝了JDK6和JDK7,但是我所有的JRE設置都指向1.6,無論是在pom中還是在Eclipse中的項目屬性頁面中。 沒有多少Maven Update Project和/或刷新解決了這個問題。

最後,我嘗試關閉該項目並重新打開它,這似乎解決了它! HTH


正如幾個人在其他地方回答的那樣,Java程序正在運行在一個Java版本的舊版本上,而不是它編譯的版本。 為了向後兼容,它需要被“交叉編譯”。 換句話說,源版本和目標Java版本之間存在不匹配。

在Eclipse菜單中更改選項不會回答原始海報,他/她表示他/她沒有使用Eclipse。 在OpenJDK javac版本1.7上,如果使用參數-source-target ,則可以交叉編譯1.6,並且在編譯時提供目標版本(即較舊版本)的rt.jar文件。 如果實際安裝1.6 JRE,則可以指向其安裝(例如,Ubuntu上的/usr/lib/jvm/java-6-openjdk-i386/jre/lib/rt.jar,/ usr / jdk / jdk1。顯然,SunOS的6.0_60 / jre / lib / rt.jar對不起,我不知道它在Windows系統上的位置)。 像這樣:

javac -source 1.6 -target 1.6 -bootclasspath /usr/lib/jvm/java-6-openjdk-i386/jre/lib/rt.jar HelloWorld.java

它看起來像你可以從互聯網下載rt.jar,並指向它。 但這不是太優雅:

javac -source 1.6 -target 1.6 -bootclasspath ./rt.jar HelloWorld.java

當我使用Ant腳本構建我的應用程序時,我遇到了同樣的問題。

我使用Eclipse進行應用程序開發,並且在項目的構建屬性中更改了編譯器版本。 但是這對我沒有用。 然後我發現我可以在Ant腳本中提供編譯器版本。

我在它編譯Java文件的部分修改了Ant腳本。

<target name="build-java" depends="prepare-build">
    <echo message="Compiling java files"/>
    <javac ....
           target="1.5"...
    </javac>
</target>

這有助於我解決不受支持的主要小問題。


當我恢復到Java 6並嘗試運行之前用Java 7編譯的類時,遇到了這個問題。對我而言,Preferences> java> compiler - >將合規性級別設置為1.6,關鍵是“配置​​項目設置”。


這個錯誤意味著你正試圖加載一個Java版本的“class”文件,該文件是用比你安裝的更新版本的Java編譯的。

例如,您的.class文件可能已經針對JDK 7進行了編譯,並且您正嘗試使用JDK 6來運行它。

所以解決方案是:

  • 升級您的Java運行時或
  • 如果有源代碼,請使用本地Java編譯器(如果有的話)重新編譯該類。

    javac FileName.java

對於開發人員來說,如果其他開發人員檢查.class文件,就會發生這種情況,並且他們已經擁有比您擁有的更新版本的Java!


首先讓我們了解一些基本知識...

JRE是NetBeans / Eclipse / standalone中的一個組件,它將為您提供庫,JVM,Java插件和Java Web Start。 請注意,它不提供編譯器或調試器。

JDK是JRE的超集以及編譯器和調試器。

因此,當您將默認庫作為JRE而不是JDK時,您將有很好的時間導入內容,但不會編譯。

相反,請將路徑設置為JDK(我使用NetBeans,並在netbeans / etc / netbeans.conf中使用netbeans.conf設置它們並更改路徑)。


  • 安裝JDK 7.0.55並為JDK 7.0.55設置Java for Eclipse
  • 通過在構建路徑JDK 7.0.55上配置,使用JDK 7.0.55構建項目。
  • 通過菜單Windows - > 首選項 - > Java - > 編譯器 - 在Eclipse中為JDK 7.0.55 設置 編譯器 ,選擇1.7。




unsupported-class-version