我正在尝试使用Notepad++作为我的一体化工具编辑,运行,编译等 .
我安装了JRE,并且我已将路径变量设置为... / bin目录 .
当我在记事本中运行“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可能是旧的或太新的 .
-
如何解决?
-
我应该安装JDK,并将我的路径变量设置为JDK而不是JRE吗?
-
JRE或JDK中的
PATH
变量有什么区别?
30 回答
当我恢复到Java 6并尝试运行以前使用Java 7编译的类时出现此问题 . 对我有用的是Preferences> java> compiler - > set compliance级别为1.6,关键是“配置项目设置”..
当我安装JDK 1.7时,问题就解决了 .
在我的情况下,问题出在服务器运行时配置中:
检查JRE是否是您需要的版本:
该项目是1.7版本,服务器JRE设置为1.6,在更改为正确的java版本后,它启动正常 .
我在Mac上有类似的情况,以下过程对我有用:
在终端中输入
然后在文件中添加此行,并保存
其中version是您计算机上的版本,例如
1.7.0_25
.退出编辑器,然后键入以下命令使其生效
然后键入java -version以检查结果
什么是
.profile
文件?资料来源:http://computers.tutsplus.com/tutorials/speed-up-your-terminal-workflow-with-command-aliases-and-profile--mac-30515
别担心,我解决了 .
它实际上很简单 - 您需要使用相同的版本安装BOTH JRE / JDK .
JRE 6 - > JDK 6
JRE 7 - > JDK 7
等等 .
发生
java.lang.UnsupportedClassVersionError
是因为编译期间JDK较高,运行时期间JDK较低 .您正在尝试使用不支持编译代码的版本的Java版本来运行程序 . So basically you must have compiled your code with a higher version and trying to run it using a lower version.
当你得到
和版本 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
.显示的版本号描述了类文件兼容的JRE的版本 .
报告的主要数字是:
(来源:Wikipedia)
要解决实际问题,您应该尝试使用较新版本的Java JRE运行Java代码,或者指定Java编译器的目标参数,以指示编译器创建与早期Java版本兼容的代码 .
例如,要生成与Java 1.4兼容的类文件,请使用以下命令行:
使用较新版本的Java编译器,您可能会收到有关未设置引导类路径的警告 . 有关此错误的更多信息,请参见博文New javac warning for setting an older source without bootclasspath .
您已使用更高版本的JDK进行编译并尝试从较低版本的JDK / JRE运行 .
要检查这一点,请参阅版本信息:
它们将是不同的,javac将具有更高的版本号 .
要解决这个问题,请使用JDK版本中的java运行,或者如果您有更新的JRE / JDK也可以运行 .
which javac
将告诉您位置,例如/usr/bin/javac
. 只需使用/usr/bin/java <program>
直接运行 .或者您可以将环境变量设置为永久解决方案 .
此错误意味着用于执行类代码的JRE无法识别所使用的Java版本 . 通常是因为生成类文件(即编译它)的Java版本更新 .
要解决它,你也可以
a)使用与运行它相同或较旧版本的Java编译器编译Java源代码 . 即安装适当的JDK .
b)使用较新版本的Java编译器编译Java源代码,但是在兼容模式下 . 即使用
-target
参数 .c)在与用于编译类的JDK相同或更新版本的JRE中运行已编译的类 .
您可以使用
javac -version
检查编译器当前使用的版本,并为运行时检查java -version
.对于编译,当然,安装和配置所需的特定JDK .
对于运行时,您可以使用JDK附带的版本或独立的JRE,但无论如何,请确保您已安装了正确的版本并且已配置PATH,这样就不会出现意外情况 .
PATH环境变量告诉命令shell在哪里查找您键入的命令 . 当您键入
java
时,命令shell解释程序将从左到右查看PATH
变量中指定的所有位置,以查找要运行的相应java
运行时可执行文件 . 如果您安装了多个Java版本 - 即您在PATH变量中指定的多个位置具有java
可执行文件,那么从左到右遇到的第一个将是执行的那个 .编译器命令是
javac
,仅随JDK一起提供 . 运行时命令是java
,随JDK一起提供,位于JRE中 .您可能安装了一个版本(51.0 = Java 7)
javac
,并且您也拥有相同版本的java
已安装,但是另一个先前版本的java
出现在PATH的前面,因此正在调用而不是您期望的版本 .您可以在Java 7中编译一些JAR库,并且只有Java 6作为Java Runtime . 一些新的库可能会发生这种情况 .
在Eclipse的菜单窗口 - >首选项 - > Java - >编译器中也检查"Configure Project Specific Settings" .
如果您使用相同的Java版本存在错误:尝试手动删除项目的构建文件夹 . 然后重启Eclipse .
最常见的问题是
JAVA_HOME
变量的配置错误,如果您安装了多个,那么它应指向正确的Java Development Kit库 .要查找SDK Java文件夹的位置,请运行以下命令:
Debian / Ubuntu
要检查您安装的java(openjdk),请通过以下方式检查:
要么:
要更改它,请使用:
如果需要,使用sudo前缀 .
选择替代java版本 .
或者检查哪些可用于安装:
如果需要,使用sudo前缀 .
然后你可以安装,例如:
如果需要,使用sudo前缀 .
Fedora,Oracle Linux,Red Hat
安装/升级适当的包:
BSD
FreeBSD Ports集合中有一个名为openjdk7的OpenJDK 7软件包,可能需要重新配置 .
见:OpenJDK wiki page .
Windows
只需从Oracle site安装适当的Java SE Development Kit库或安装即可
詹金斯
如果您遇到Jenkins的这个问题,请参阅:
但是,使用
update-alternatives
选择正确版本的Java(较新版本)应该可行 .您已经使用JDK 7编译了Java类,并且您正尝试在JDK 6上运行相同的类 .
java -version
:您的Java文件使用与您尝试运行它的版本(较低的运行时版本)不同的版本(更高的编译器版本)进行编译 .
基本的理解是,使用较低版本编译的类应该在更高版本中运行 . 但相反(使用更高的编译器版本编译并尝试以较低的运行时版本运行它)有时是不可能的 .
因此,在尝试执行程序时会显示此错误 . Unsupported major.minor version x.x
(来源:oracle.com . )
基于此......
在Eclipse中,右键单击package explorer中的项目:
Build Path - > Configure Build Path
下:
Java Build Path - > Libraries - > Add Library - > JRE System Library - > Installed JREs - > Search .
通过在搜索完成后选择列表中的库来添加所需的JRE .
如果您在使用Maven时遇到此问题,则可以使用插件Maven Compiler交叉编译代码 .
更新:如果您使用的是JDK 8,请将
source
和target
设置为1.8
.今天,这个错误信息出现在Ubuntu 12.04.2 LTS上Ubuntu 12.04.2 LTS(精确穿山甲):
Struts应用程序使用Java 7编译 .
事实证明,有人使用“service tomcat [stop / start]”来重启Tomcat 7,
这导致“不支持的major.minor版本51.0”错误 .
当我们使用“/etc/init.d/tomcat7 [stop / start]”重启Tomcat 7时,问题就解决了 .
我解决了我跑了:
该错误具有误导性,
Unsupported major.minor version 51.0
. 这给人的印象是不支持版本51(Java 7) . 我们应该使用Java 6 .该错误应该是:
首先让我们了解一些基础知识......
JRE是NetBeans / Eclipse / standalone中的一个组件,它将为您提供库,JVM,Java插件和Java Web启动 . 请注意,它不提供编译器或调试器 .
JDK是JRE的超集以及编译器和调试器 .
因此,当您将默认库作为JRE而不是JDK时,您将有一个很好的时间导入内容,但它不会编译 .
相反,设置您的JDK路径(我使用NetBeans,并使用netbeans / etc / netbeans.conf中的netbeans.conf设置它们并更改路径) .
从Eclipse运行Ant时我有相同的错误消息,但这里提到的其他解决方案并没有解决我的问题 . 有趣的是,从Windows命令行运行Ant运行正常,因此它必须是Eclipse中的配置问题 .
事实证明,在Eclipse下,您可以指定Ant应该运行的环境,并将其设置为JRE而不是JDK .
转到:运行 - >外部工具 - >外部工具配置...
选择项目的Ant build.xml(如果有多个项目)
激活标签'JRE'
这里被选中'Separate JRE: jre6' . 当我从1.6或1.7系列更改为JDK时,错误消失了 .
我在1.7中编写的项目遇到了同样的问题,并试图在1.6中执行 .
我在Eclipse中的解决方案:
右键单击您的项目 Properties -> Java Build Path -> Libraries
选择您的JRE系统库并单击右侧的 Edit ,然后选择目标JRE .
现在转到左侧的 Java Compiler ,然后将 Compiler compliance level 更改为目标 .
这对我有用 .
当我使用Ant脚本来构建我的应用程序时,我遇到了同样的问题 .
我使用Eclipse进行应用程序开发,并在项目的构建属性中更改了编译器版本 . 但这对我不起作用 . 然后我发现我可以在Ant脚本中提供编译器版本 .
我在编译Java文件的部分修改了Ant脚本 .
这对我有用,可以解决不受支持的主要小问题 .
哦Mac OS X我能够通过设置JAVA_HOME变量来解决这个问题:
此错误意味着您正在尝试加载使用比您安装的Java更新版本编译的Java“类”文件 .
例如,您的
.class
文件可能已经为JDK 7编译,并且您正在尝试使用JDK 6运行它 .所以解决方案是:
升级Java运行时或
如果您有源,则使用本地Java编译器(如果有的话)重新编译该类 .
javac FileName.java
对于开发人员来说,如果另一个开发人员签入.class文件,并且他们有一个比你更新的java版本,就会发生这种情况!
在Eclipse中,我只是转到菜单命令Window - > Preferences - > Java - > Compiler,然后将"Compiler compliance level"设置为1.6 .
我遇到了一个问题,即我必须从命令行对我的项目运行Maven编译才能运行我的单元测试;如果我对测试类进行了更改并让Eclipse自动重新编译它,那么我得到了“Unsupported major.minor version 51.0”错误 .
我确实安装了JDK6和JDK7,但我的所有JRE设置都指向1.6,它们都位于pom和Eclipse中的项目属性页面中 . 没有任何Maven更新项目和/或刷新解决了这个问题 .
最后,我尝试关闭项目并重新打开它,这个似乎解决了! HTH
安装JDK 7.0.55并为JDK 7.0.55设置Eclipse的Java .
通过在构建路径JDK 7.0.55上进行配置,使用JDK 7.0.55构建项目 .
通过菜单Windows - > Preferences - > Java - > Compiler - 选择1.7,在Eclipse中为JDK 7.0.55设置编译器 .
正如几个人在其他地方所解释的那样,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系统上的位置) . 像这样:看起来你可以从互联网上下载rt.jar,然后指向它 . 这不是太优雅了: