我正在尝试使用 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 版本可能太旧或太新。
我如何解决它?我应该安装 JDK,并将我的路径变量设置为 JDK 而不是 JRE? JRE 或 JDK 中的 PATH 变量有什么区别?
显示的版本号描述了类文件兼容的 JRE 版本。
报告的主要数字是:
Java SE 17 = 61,
Java SE 16 = 60,
Java SE 15 = 59,
Java SE 14 = 58,
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.lang.UnsupportedClassVersionError
发生是因为编译时 JDK 较高而运行时 JDK 较低。
sudo update-alternatives --config java
这样做。
在 Eclipse 中,我只是转到菜单命令 Window -> Preferences -> Java -> Compiler,然后将“Compiler compliance level”设置为 1.6。
别担心,我已经解决了。
这实际上很简单 - 您需要安装相同版本的 JRE / JDK。
JRE 6 -> JDK 6
JRE 7 -> JDK 7
等等。
此错误意味着您正在尝试加载使用比您安装的 Java 版本更新的 Java 编译的 Java“类”文件。
例如,您的 .class
文件可能已针对 JDK 7 编译,而您正尝试使用 JDK 6 运行它。
所以解决方案是:
升级您的 Java 运行时或
如果您有源代码,请使用本地 Java 编译器(如果有的话)重新编译该类。 javac 文件名.java
对于开发人员,如果另一个开发人员签入 .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
其中 version 是您计算机上的版本,例如 1.7.0_25
。
退出编辑器,然后键入以下命令使其生效
source ~/.profile
然后输入 java -version 查看结果
java -version
什么是 .profile
文件?
.profile 文件是一个隐藏文件。它是一个可选文件,它告诉系统在其配置文件登录的用户登录时运行哪些命令。例如,如果我的用户名是 bruno,并且 /Users/bruno/ 中有一个 .profile 文件,则它的所有内容将在登录过程中执行。
在 Eclipse 的菜单 Window -> Preferences -> Java -> Compiler 检查“配置项目特定设置”。
如果您仍然遇到相同 Java 版本的错误:尝试手动删除项目的构建文件夹。然后重新启动 Eclipse。
您可以在 Java 7 中编译一些 JAR 库,并且您只有 Java 6 作为 Java 运行时。一些新的库可能会发生这种情况。
最常见的问题是您的 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、红帽
通过以下方式安装/升级适当的软件包:
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 软件包,可能需要重新配置它。
请参阅:OpenJDK wiki page。
视窗
只需从 Oracle site 安装适当的 Java SE Development Kit 库或安装
詹金斯
如果您在使用 Jenkins 时遇到此问题,请参阅:
JENKINS-30561 - 无法使用 SSH 启动代理
但是,使用 update-alternatives
选择正确版本的 Java(较新)应该可以。
我用 1.7 编写的项目遇到了同样的问题,并试图在 1.6 中执行。
我在 Eclipse 中的解决方案:
右键单击您的项目属性-> Java 构建路径-> 库
选择您的 JRE System Library 并单击右侧的 Edit,然后选择目标 JRE。
现在转到左侧的 Java Compiler,并将 Compiler 合规级别更改为您的目标。
这对我有用。
正如几个人在其他地方回答的那样,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,/usr/jdk/jdk1.jar) 6.0_60/jre/lib/rt.jar 显然在 SunOS 上。抱歉,我不知道它在 Windows 系统上的位置)。像这样:
javac -source 1.6 -target 1.6 -bootclasspath /usr/lib/jvm/java-6-openjdk-i386/jre/lib/rt.jar HelloWorld.java
看起来你可以从 Internet 上下载 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 中,右键单击包资源管理器中的项目:
构建路径 -> 配置构建路径
在下面:
Java 构建路径 -> 库 -> 添加库 -> JRE 系统库 -> 已安装的 JRE -> 搜索。
搜索完成后,通过在可用列表中选择库来添加所需的 JRE。
如果您使用 Maven,请设置您的 Java 编译级别。打开命令行并为您的编译级别编写 java -version:
如果使用 IntelliJ IDEA,选择项目 → 文件 → 设置 → 构建执行部署 → 编译器 → Java 编译器。然后将字节码更改为 1.7,如下图所示:
如果您在使用 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。
转到:运行 -> 外部工具 -> 外部工具配置...
为您的项目选择 Ant build.xml(如果您有多个项目)
激活选项卡“JRE”
这里选择了“单独的 JRE:jre6”。当我将它从 1.6 或 1.7 系列更改为 JDK 时,错误消失了。
您已使用较高版本的 JDK 编译并尝试从较低版本的 JDK/JRE 运行。
要检查这一点,请参阅版本信息:
javac -version
java -version
它们会有所不同,javac 会有更高的版本号。
要解决此问题,请使用 JDK 版本中的 java 运行,或者如果您有更新的 JRE/JDK 也可以运行。
which javac
会告诉您位置,例如 /usr/bin/javac
。只需使用 /usr/bin/java <program>
直接运行。
或者您可以将环境变量设置为永久解决方案。
我如何解决它?
此错误意味着用于执行您的类代码的 JRE 无法识别所使用的 Java 版本。通常是因为生成类文件(即编译它)的 Java 版本较新。
要修复它,您可以
a) 使用与运行 Java 编译器相同或更旧版本的 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 环境变量告诉命令外壳在哪里查找您键入的命令。当您键入 java
时,命令 shell 解释器将从左到右查看 PATH
变量中指定的所有位置,以找到要运行的适当 java
运行时可执行文件。如果您安装了多个 Java 版本 - 即您在 PATH 变量中指定的多个位置有 java
可执行文件,那么从左到右遇到的第一个将是执行的那个。
编译器命令为 javac
,仅随 JDK 提供。运行时命令是 java
,它随 JDK 一起提供,在 JRE 中。
您可能安装了 javac
的一个版本 (51.0 = Java 7),并且您还安装了相同版本的 java
,但另一个先前版本的 java
出现在 PATH 的较早位置,因此正在调用而不是您期望的调用。
当我恢复到 Java 6 并尝试运行以前用 Java 7 编译的类时遇到了这个问题。对我有用的是 Preferences > java > compiler --> 将合规级别设置为 1.6 并至关重要地“配置项目设置”..
今天,这个错误信息出现在我们的Tomcat 7 on Ubuntu 12.04.2 LTS(Precise Pangolin):
/var/log/tomcat7/localhost.2014-04-08.log:2014 年 4 月 8 日上午 9:00:55 org.apache.catalina.core.StandardContext filterStart 严重:异常启动过滤器 struts2 java.lang.UnsupportedClassVersionError:控制器/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”
这会导致“Unsupported major.minor version 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 版本xx
问:我在 Java 7 中创建了一个应用程序,但是当我的用户尝试运行它时,他们收到 Unsupported major.minor version 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 XI 可以通过设置 JAVA_HOME 变量来解决这个问题:
export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.7.0_75.jdk/Contents/Home
就我而言,问题出在服务器运行时配置中:
https://i.stack.imgur.com/oUcdV.png
检查 JRE 是您需要的版本:
https://i.stack.imgur.com/gDK6L.png
该项目的版本为 1.7,服务器 JRE 设置为 1.6,更改为正确的 java 版本后,它可以正常启动。
我遇到了一个问题,即我必须从命令行对我的项目运行 Maven 编译才能运行我的单元测试;如果我对测试类进行了更改并让 Eclipse 自动重新编译它,那么我会收到“Unsupported major.minor version 51.0”错误。
我确实安装了 JDK6 和 JDK7,但是我的所有 JRE 设置都指向 1.6,无论是在 pom 中还是在 Eclipse 的项目属性页面中。没有多少 Maven 更新项目和/或刷新解决了这个问题。
最后我尝试关闭项目并重新打开它,这似乎解决了它!高温高压
您已经使用 JDK 7 编译了 Java 类,并且尝试在 JDK 6 上运行相同的类。
安装 JDK 7.0.55 并将 Java for Eclipse 设置为 JDK 7.0.55。
通过在构建路径 JDK 7.0.55 上配置,使用 JDK 7.0.55 构建项目。
通过菜单 Windows -> Preferences -> Java -> Compiler - 选择 1.7 在 Eclipse 中为 JDK 7.0.55 设置编译器。