提问



我正在尝试使用Notepad ++作为我的一体化工具编辑,运行,编译等[[。[61]


我安装了JRE,并且已将路径变量设置为.../bin目录。[62]


当我在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 SE 10 = 54,
Java SE 9 = 53,
Java SE 8 = 52,
Java SE 7 = 51,
Java SE 6.0 = 50,
Java SE 5.0 = 49,
JDK 1.4 = 48,
JDK 1.3 = 47,
JDK 1.2 = 46,
JDK 1.1 = 45


(来源:维基百科)[63]


要解决实际问题,您应该尝试使用较新版本的Java JRE运行Java代码,或者指定Java编译器的目标参数,以指示编译器创建与早期Java版本兼容的代码。


例如,要生成与Java 1.4兼容的类文件,请使用以下命令行:


javac -target 1.4 HelloWorld.java


使用较新版本的Java编译器,您可能会收到有关未设置引导类路径的警告。有关此错误的更多信息,请参阅博客文章新javac警告,用于设置不带bootclasspath的旧源。[64]

其它参考1


java.lang.UnsupportedClassVersionError是因为在编译期间JDK较高而在运行时期间JDK较低。

其它参考2


在Eclipse中,我只是转到菜单命令 Window - > Preferences - > Java - > Compiler ,然后设置编译器合规级别为1.6。

其它参考3


别担心,我解决了。


它实际上很简单 - 您需要使用相同的版本安装BOTH JRE/JDK。


JRE 6 - > JDK 6


JRE 7 - > JDK 7


等等。

其它参考4


此错误意味着您尝试加载使用比您安装的Java更新版本编译的Java类文件。


例如,您的.class文件可能已经为JDK 7编译,并且您正在尝试使用JDK 6运行它。


所以解决方案是:



  • 升级Java运行时或

  • 如果您有源,请使用本地Java编译器(如果有的话)重新编译该类。


    javac FileName.java



对于开发人员来说,如果另一个开发人员检入.class文件,并且他们有一个比你更新的java版本,就会发生这种情况!

其它参考5


您正在尝试使用不支持编译代码的版本的Java版本来运行程序。 所以基本上你必须使用更高版本编译代码并尝试使用较低版本运行它。


当你得到


Unsupported major.minor version 51.0


版本 51.0 对应于 J2SE 7 您最有可能在Java 7中编译代码并尝试使用较低版本运行它。检查java -version显示的内容。它应该是Java 7版本。如果没有在PATH/JAVA_HOME中进行适当的更改。或者您可以使用与尝试运行代码相同的版本进行编译。如果配置令人困惑,您可以始终提供绝对路径/home/user/jdk1.7.0_11/bin/javac/home/user/jdk1.7.0_11/bin/java

其它参考6


我在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 [65]

其它参考7


在Eclipse的菜单窗口 - > 首选项 - > Java - > 编译器中也检查配置项目特定设置。


如果您使用相同的Java版本存在错误:尝试手动删除项目的构建文件夹。然后重启Eclipse。

其它参考8


您可以在Java 7中编译一些JAR库,并且只有Java 6作为Java Runtime。一些新的库可能会发生这种情况。

其它参考9


最常见的问题是您的JAVA_HOME变量配置错误,该变量应该指向正确的Java Development Kit库,如果您安装了多个。


要查找SDK Java文件夹的位置,请运行以下命令:


jrunscript -e 'java.lang.System.out.println(java.lang.System.getProperty("java.home"));'


于Debian/Ubuntu



要检查已安装的java(openjdk),请通过以下方式检查:


dpkg -l "openjdk*" | grep ^i


要么:


update-java-alternatives -l


要更改它,请使用:


update-alternatives --config java


如果需要,前缀为sudo


选择替代java版本。


或者检查哪些可用于安装:


apt-cache search ^openjdk


如果需要,前缀为sudo


然后你可以安装,例如:


apt-get install openjdk-7-jre


如果需要,sudo的前缀。


Fedora,Oracle Linux,Red Hat



安装/升级适当的包:


yum install java-1.7.0-openjdk java-1.7.0-openjdk-devel



  java-1.7.0-openjdk包只包含Java运行时环境。如果要开发Java程序,请安装java-1.7.0-openjdk-devel包。



BSD



FreeBSD Ports集合中有一个名为openjdk7的OpenJDK 7软件包,可能需要重新配置。[66]


请参阅:OpenJDK维基页面。[67]




只需从Oracle站点安装适当的Java SE Development Kit库或安装[68]


詹金斯



如果您在Jenkins遇到此问题,请参阅:



  • JENKINS-30561 - 无法使用SSH启动座席



但是,使用update-alternatives选择正确版本的Java(较新版本)应该可行。[69]

其它参考10


当我使用Ant脚本构建我的应用程序时,我遇到了同样的问题。[70]


我使用Eclipse进行应用程序开发,并在项目的构建属性中更改了编译器版本。但这对我没有用。然后我发现我可以在Ant脚本中提供编译器版本。[71]


我在编译Java文件的部分修改了Ant脚本。


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


这对我有用,可以解决不受支持的主要小问题。

其它参考11


当我安装JDK 1.7时,问题就解决了。[72]

其它参考12


我在1.7中编写的项目遇到了同样的问题,并试图在1.6中执行。


我在Eclipse中的解决方案:



  • 右键单击项目属性 - > Java构建路径 - >库

  • 选择您的JRE系统库,然后点击右侧的修改,然后选择目标JRE。

  • 现在转到左侧的 Java Compiler ,并将编译器合规级别更改为目标。



这对我有用。

其它参考13


正如几个人在其他地方所解释的那样,Java程序运行在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,显然是在SunOS上的/usr/jdk/jdk1.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

其它参考14


基于此......


J2SE 8 = 52
J2SE 7 = 51
J2SE 6.0 = 50
J2SE 5.0 = 49
JDK 1.4 = 48
JDK 1.3 = 47
JDK 1.2 = 46
JDK 1.1 = 45


在Eclipse中,右键单击package explorer中的项目:


构建路径 - > 配置构建路径


下:


Java构建路径 - > - > 添加库 - > JRE系统库 - > 已安装的JRE - > 搜索


通过在搜索完成后选择列表中的库来添加所需的JRE。

其它参考15



  • 如果您使用Maven,请设置Java编译级别。打开命令行并为编译级别编写java -version:


    [73]

  • 如果您使用IntelliJ IDEA,请选择项目→文件→设置→构建执行部署→编译器→ Java编译器。然后将字节代码更改为1.7,如下图所示:


    [74]


其它参考16


从Eclipse运行Ant时我有相同的错误消息,但这里提到的其他解决方案并没有解决我的问题。有趣的是,从Windows命令行运行Ant运行正常,所以它必须是一个配置问题蚀。


事实证明,在Eclipse下,您可以指定Ant应该运行的环境,并将其设置为JRE而不是JDK。



  • 转到:运行 - >外部工具 - >外部工具配置...

  • 为项目选择Ant build.xml(如果您有多个项目)

  • 激活标签JRE

  • 这里选择了Separate JRE:jre6。当我从1.6或1.7系列更改为JDK时,错误消失了。


其它参考17



  我如何解决它?



此错误意味着用于执行类代码的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时,命令shell解释程序将从左到右查看PATH变量中指定的所有位置,以查找要运行的相应java运行时可执行文件。如果你安装了多个版本的Java - 即你在PATH变量中指定的多个位置有java可执行文件,那么从左到右遇到的第一个将是执行的那个。


编译器命令是javac,只有JDK附带。运行时命令是java并随JDK一起提供并位于JRE中。


您可能安装了javac的一个版本(51.0=Java 7),并且您也安装了相同版本的java,但是java的另一个先前版本出现了在PATH的早期,所以被调用而不是你期望的那个。

其它参考18


如果您在使用Maven时遇到此问题,可以使用插件Maven编译器交叉编译代码。[75] [76]


 <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

其它参考19


您已使用更高版本的JDK进行编译并尝试从较低版本的JDK/JRE运行。[77]


要检查这一点,请参阅版本信息:


javac -version

java -version


它们将是不同的,javac将具有更高的版本号。


要解决这个问题,请使用JDK版本中的java运行,或者如果您有更新的JRE/JDK也可以运行。


which javac会告诉你位置,例如/usr/bin/javac。只需使用/usr/bin/java <program>直接运行。


或者您可以将环境变量设置为永久解决方案。

其它参考20


当我恢复到Java 6并尝试运行以前使用Java 7编译的类时出现此问题。对我有用的是Preferences> java> compiler - >将合规性级别设置为1.6并且至关重要的是配置项目设置。

其它参考21


今天,这个错误信息出现在我们的Tomcat 7上的Ubuntu 12.04.2 LTS(精确穿山甲):[78] [79]



  /var/log/tomcat7/localhost.2014-04-08.log:

  2014年4月8日9:00:55 org.apache.catalina.core.StandardContext filterStart

  严重:异常启动过滤器struts2

  java.lang.UnsupportedClassVersionError:controller/ReqAccept:不支持的major.minor版本51.0(无法加载类controller.ReqAccept)



Struts应用程序是用Java 7编译的。[80]


事实证明,有人使用service tomcat [[stop/start]]来重启Tomcat 7,



  $ ps -ef | grep java

  tomcat7 31783 1 32 20:13? 00:00:03/usr/lib/jvm/default-java/bin/java ...

  $/usr/lib/jvm/default-java/bin/java -version

  java版1.6.0_27



这导致不支持的major.minor版本51.0错误。


当我们使用/etc/init.d/tomcat7 [[stop/start]]重启Tomcat 7时,问题就解决了。



  $ ps -ef | grep java

  tomcat7 31886 1 80 20:24? 00:00:10/usr/local/java/jdk1.7.0_15/bin/java

  $/usr/local/java/jdk1.7.0_15/bin/java -version

  java版1.7.0_15


其它参考22


您的Java文件使用与您尝试运行它的版本(较低的运行时版本)不同的版本(更高的编译器版本)进行编译。


基本的理解是,使用较低版本编译的类应该在更高版本中运行。但相反(使用更高的编译器版本编译并尝试以较低的运行时版本运行它)有时是不可能的。


因此,在尝试执行程序时会显示此错误。 不支持的major.minor版本x.x



  问:我在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。)[81]

其它参考23


我解决了我跑了:


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和更高版本)代替


其它参考24


哦Mac OS X我能够通过设置JAVA_HOME变量来解决这个问题:


export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.7.0_75.jdk/Contents/Home

其它参考25


首先让我们得到一些正确的基础......


JRE是NetBeans/Eclipse/standalone中的一个组件,它将为您提供库,JVM,Java插件和组件。 Java web start。请注意,它不提供编译器或调试器。[82] [83]


JDK是JRE的超集以及编译器和调试器。


因此,当您将默认库作为JRE而不是JDK时,您将会很愉快地导入内容,但它不会编译。


相反,设置您的JDK路径(我使用NetBeans,并使用netbeans/etc/netbeans.conf中的netbeans.conf设置它们并更改路径)。

其它参考26


我遇到了一个问题,即我必须从命令行对我的项目运行Maven编译才能运行我的单元测试;如果我对测试类进行了更改并让Eclipse自动重新编译它,那么我得到了Unsupported major.minor version 51.0错误。


我确实安装了JDK6和JDK7,但我的所有JRE设置都指向1.6,它们都位于pom和Eclipse中的项目属性页面中。没有任何Maven更新项目和/或刷新解决了这个问题。


最后我尝试关闭项目并重新打开它,这似乎解决了它! HTH

其它参考27


您已经使用JDK 7编译了Java类,并且您正尝试在JDK 6上运行相同的类。

其它参考28



  • 安装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设置编译器/em> - 选择1.7。


其它参考29


就我而言,问题出在服务器运行时配置中:[84]


[85]


检查JRE是否是您需要的版本:


[86]


该项目是1.7版本,服务器JRE设置为1.6,在更改为正确的java版本后,它启动正常。