我正在尝试使用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可能是旧的或太新的。
PATH
变量有什么区别?显示的版本号描述了类文件兼容的JRE的版本。
报告的主要数字是:
Java SE 13 = 57,
Java SE 12 = 56,
Java SE 11 = 55,
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
(来源:Wikipedia)
要解决实际问题,您应该尝试使用较新版本的Java JRE运行Java代码,或者指定Java编译器的目标参数,以指示编译器创建与早期Java版本兼容的代码。
例如,要生成与Java 1.4兼容的类文件,请使用以下命令行:
javac -target 1.4 HelloWorld.java
使用较新版本的Java编译器,您可能会收到有关未设置引导类路径的警告。有关此错误的更多信息,请参见博客文章New javac warning for setting an older source without bootclasspath。
最常见的问题是你的JAVA_HOME
变量配置错误,如果你安装了多个,它应该指向正确的Java Development Kit库。
要查找SDK Java文件夹的位置,请运行以下命令:
jrunscript -e 'java.lang.System.out.println(java.lang.System.getProperty("java.home"));'
要检查您安装的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
作为前缀。
安装/升级适当的包:
yum install java-1.7.0-openjdk java-1.7.0-openjdk-devel
java-1.7.0-openjdk
包只包含Java Runtime Environment。如果要开发Java程序,请安装java-1.7.0-openjdk-devel
软件包。
FreeBSD Ports集合中有一个名为openjdk7的OpenJDK 7软件包,可能需要重新配置。
只需从Oracle site安装适当的Java SE Development Kit库或安装即可
如果您遇到Jenkins的这个问题,请参阅:
但是,使用update-alternatives
选择正确版本的Java(较新版本)应该可行。
当我安装JDK 1.7时,问题就解决了。
我在1.7中编写的项目遇到了同样的问题,并试图在1.6中执行。
我在Eclipse中的解决方案:
这对我有用。
正如几个人在其他地方所解释的那样,Java程序运行在Java的旧版本上,而不是编译它的版本。它需要“交叉编译”以实现向后兼容。换句话说,源Java版本和目标Java版本之间存在不匹配。
更改Eclipse菜单中的选项无法回答原始海报,他说他/她没有使用Eclipse。在OpenJDK javac 1.7版本中,如果使用参数-source
和-target
,则可以交叉编译1.6,并在编译时提供目标版本(即旧版本)的rt.jar -file。如果您实际安装了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
基于此......
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。
如果您在使用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,请将source
和target
设置为1.8
。
从Eclipse运行Ant时我有相同的错误消息,但这里提到的其他解决方案并没有解决我的问题。有趣的是,从Windows命令行运行Ant运行正常,因此它必须是Eclipse中的配置问题。
事实证明,在Eclipse下,您可以指定Ant应该运行的环境,并将其设置为JRE而不是JDK。
我如何解决它?
此错误意味着用于执行类代码的JRE无法识别所使用的Java版本。通常是因为生成类文件(即编译它)的Java版本更新。
要修复它,你也可以
a)使用与运行Java编译器相同或较旧版本的Java编译器编译Java源代码。即安装适当的JDK。
b)使用较新版本的Java编译器编译Java源代码,但是在兼容模式下。即使用-target
参数。
c)在JRE中运行已编译的类,该JRE与用于编译类的JDK相同或更新。
您可以使用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中。
您可能安装了一个版本(51.0 = Java 7)的javac
,并且您也安装了相同版本的java
,但另一个先前版本的java
出现在PATH的早期版本中,因此被调用而不是一个你期望的。
java.lang.UnsupportedClassVersionError
的发生是因为在编译期间JDK更高,在运行时期间JDK更低。
您已使用更高版本的JDK进行编译并尝试从较低版本的JDK / JRE运行。
要检查这一点,请参阅版本信息:
javac -version
java -version
它们将是不同的,javac将具有更高的版本号。
要解决这个问题,请使用JDK版本中的java运行,或者如果您有更新的JRE / JDK也可以运行。
which javac
会告诉你位置,例如/usr/bin/javac
。只需使用/usr/bin/java <program>
直接运行。
或者您可以将环境变量设置为永久解决方案。
当我恢复到Java 6并尝试运行以前使用Java 7编译的类时出现此问题。对我有用的是Preferences> java> compiler - >将合规级别设置为1.6并且至关重要的是“配置项目设置”。
今天,这个错误信息出现在Tomcat(精确穿山甲)上的Ubuntu 12.04.2 LTS 7中:
/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编译。
事实证明,有人使用“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”
我解决了我跑了:
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和更高版本)代替
您的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 6的最终用户触发Java 7自动更新,这个问题就会消失。这个时间表还没有确定,我们希望让开发人员有时间首先解决他们的代码和JDK 7之间的任何问题。
(来源:oracle.com。)
哦Mac OS X我能够通过设置JAVA_HOME变量来解决这个问题:
export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.7.0_75.jdk/Contents/Home
我遇到了一个问题,即我必须从命令行对我的项目运行Maven编译才能运行我的单元测试;如果我对测试类进行了更改并让Eclipse自动重新编译它,那么我得到了“不支持的major.minor版本51.0”错误。
我确实安装了JDK6和JDK7,但我的所有JRE设置都指向1.6,它们都位于pom和Eclipse中的项目属性页面中。没有任何Maven更新项目和/或刷新解决了这个问题。
最后,我尝试关闭项目并重新打开它,这似乎解决了它! HTH
您已经使用JDK 7编译了Java类,并且您正尝试在JDK 6上运行相同的类。
在Eclipse中,我只是转到菜单命令Window - > Preferences - > Java - > Compiler,然后将“Compiler compliance level”设置为1.6。
答案是针对这个问题的:
线程“main”中的异常java.lang.UnsupportedClassVersionError:edu / stevens / cs549 / dhts / main / LocalContext:不支持的major.minor版本52.0
我遇到了同样的问题。对于那些在AWS ec2实例中遇到此问题的人,并以某种方式被重定向到此问题。我正在回答这些问题,并想分享我是如何做到的。我遇到了麻烦,因为Amazon EC2实例运行的是java 1.7版,也许我的项目与它不兼容,因为我使用的是Maven,并且它预先配置了java 1.8。所以我安装了新版本的java:
sudo yum -y install java-1.8.0
然后重要的一步是删除旧版本:
sudo yum remove java-1.7.0-openjdk
记得在安装新版本后删除它,否则它将继续使用相同的旧版本,我希望它能解决你的问题,这在我的情况下做了。
别担心,我解决了。
它实际上很简单 - 您需要使用相同的版本安装BOTH JRE / JDK。
JRE 6 - > JDK 6
JRE 7 - > JDK 7
等等。
此错误意味着您正在尝试加载使用比您安装的Java更新版本编译的Java“类”文件。
例如,您的.class
文件可能已经为JDK 7编译,并且您尝试使用JDK 6运行它。
所以解决方案是:
对于开发人员来说,如果另一个开发人员检入.class文件,并且他们有一个比你更新的java版本,就会发生这种情况!
您正在尝试使用不支持编译代码版本的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
。
我在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文件,则其所有内容将在登录过程中执行。
在Eclipse的菜单窗口 - >首选项 - > Java - >编译器中也检查“配置项目特定设置”。
如果您仍然遇到相同Java版本的错误:尝试手动删除项目的构建文件夹。然后重启Eclipse。
您可以在Java 7中编译一些JAR库,并且只有Java 6作为Java Runtime。一些新的库可能会发生这种情况。