如何修复java.lang.unsupportedclassversionerror:不支持的主要版本次要版本

lf3rwulv  于 2021-06-29  发布在  Java
关注(0)|答案(19)|浏览(764)

我正在尝试使用notepad作为我的综合工具编辑、运行、编译等。
我已经安装了jre,并且已经将path变量设置到 .../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,并将path变量设置为jdk而不是jre吗?
这两者有什么区别 PATH jre或jdk中的变量?

8xiog9wr

8xiog9wr1#

我在1.7中编写的一个项目中遇到了同样的问题,并尝试在1.6中执行。
我在eclipse中的解决方案:
右键单击项目属性->java构建路径->库
选择您的jre系统库并单击右侧的“编辑”,然后选择目标jre。
现在转到左边的java编译器,并将编译器符合性级别更改为您的目标。
对我有用。

s8vozzvw

s8vozzvw2#

您正在尝试使用不支持编译代码的版本的java版本运行程序。所以基本上你必须用一个更高的版本编译你的代码,并试图用一个更低的版本运行它。
当你得到

Unsupported major.minor version 51.0

版本51.0对应于J2SE7,您很可能已经用Java7编译了代码,并尝试使用较低版本运行它。检查什么 java -version 显示。它应该是Java7版本。如果没有,请在路径/java\u home中进行适当的更改。或者,您可以使用尝试运行代码的相同版本进行编译。如果配置混乱,你可以给出绝对路径 /home/user/jdk1.7.0_11/bin/javac 以及 /home/user/jdk1.7.0_11/bin/java .

gstyhher

gstyhher3#

此错误意味着您正试图加载一个java“类”文件,该文件是用比您安装的版本更新的java编译的。
例如,你的 .class 文件可能是为jdk7编译的,您正在尝试用jdk6运行它。
所以解决方法是:
升级java运行时或
如果有源代码,请使用本地java编译器(如果有)重新编译该类。
javac文件名.java
对于开发人员来说,如果另一个开发人员签入.class文件,并且他们拥有比您更新的java版本,则可能会发生这种情况!

ijnw1ujt

ijnw1ujt4#

我在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

rkue9o1l

rkue9o1l5#

您可以用Java7编译一些jar库,而java运行时只有Java6。一些新的图书馆可能会这样。

k2arahey

k2arahey6#

在eclipse中,我只需进入菜单command window->preferences->java->compiler,然后将“compiler compliance level”设置为1.6。

cvxl0en2

cvxl0en27#

显示的版本号描述了类文件兼容的jre版本。
报告的主要数字是:

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

(来源:维基百科)
要解决实际问题,您应该尝试使用较新版本的javajre运行java代码,或者向java编译器指定target参数,以指示编译器创建与早期java版本兼容的代码。
例如,要生成与java 1.4兼容的类文件,请使用以下命令行:

javac -target 1.4 HelloWorld.java

对于较新版本的java编译器,您可能会得到一个关于未设置引导类路径的警告。有关此错误的更多信息,请参阅一篇博客文章newjavac warning for setting a older source without bootclasspath。

6tr1vspr

6tr1vspr8#

基于此。。。

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中的project:
生成路径->配置生成路径
下:
java构建路径->库->添加库->jre系统库->安装的jre->搜索。
搜索完成后,通过在可用列表中选择库来添加所需的jre。

blmhpbnm

blmhpbnm9#

正如一些人在其他地方所回答的那样,java程序运行在一个比它编译时所用版本更旧的java上。为了向后兼容,它需要“交叉编译”。换句话说,源和目标java版本之间存在不匹配。
更改eclipse菜单中的选项不会回答原来的海报,海报上的人说他/她没有使用eclipse。在openjdkjavacversion1.7上,如果使用参数,可以对1.6进行交叉编译 -source 以及 -target ,并在编译时提供目标版本(即旧版本)的rt.jar文件。如果您真的安装了1.6JRE,您可以指向它的安装(例如,在ubuntu上是/usr/lib/jvm/java-6-openjdk-i386/jre/lib/rt.jar,在sunos上是/usr/jdk/jdk1.6.060/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

看起来您可以从internet下载rt.jar并指向它。但这并不太优雅:

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

j8ag8udp10#

最常见的问题是错误配置您的 JAVA_HOME 变量,该变量应指向正确的java开发工具包库(如果已安装多个)。
要查找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的openjdk7包,它可能需要重新配置。
请参阅:openjdkwiki页面。

Windows

只需从oracle站点安装适当的JavaSE开发工具包库或安装

Jenkins

如果您与jenkins遇到此问题,请参阅:
jenkins-30561-无法使用ssh启动代理
但是,选择正确的java版本(更新版本)时 update-alternatives 应该有用。

ogsagwnx

ogsagwnx11#

如果在使用maven时遇到这个问题,可以使用插件maven编译器编译代码。

<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>
       .....

更新:设置 source 以及 target1.8 ,如果您使用的是jdk 8。

9rbhqvlz

9rbhqvlz12#

我在使用ant脚本构建应用程序时也遇到了同样的问题。
我使用eclipse进行应用程序开发,并在项目的build属性中更改了编译器版本。但那对我不起作用。然后我发现我可以在ant脚本中提供编译器版本。
我在编译java文件的部分修改了ant脚本。

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

这对我解决了不受支持的主要和次要问题起了作用。

qltillow

qltillow13#

我该怎么修?
此错误意味着用于执行类代码的jre无法识别所用java的版本。通常是因为生成类文件(即编译的)的java版本较新。
要解决这个问题,你可以
a) 使用与运行java编译器相同或更旧版本的java编译器编译java源代码。i、 e.安装适当的jdk。
b) 使用较新版本的java编译器编译java源代码,但使用兼容模式。i、 e.使用 -target 参数。
c) 在与用于编译类的jdk相同或更新版本的jre中运行已编译的类。
您可以检查当前使用的版本 javac -version 对于编译器,以及 java -version 对于运行时。
我应该安装jdk,并将path变量设置为jdk而不是jre吗

pprl5pva

pprl5pva14#

如果使用maven,请设置java编译级别。打开命令行并写入 java -version 对于您的编译级别:

如果您使用intellij idea,请选择project→ 文件→ 设置→ 生成执行部署→ 编译程序→ java编译器。然后将字节码更改为1.7,如下图所示:

eivgtgni

eivgtgni15#

在eclipse的菜单窗口->首选项->java->编译器中,也选中“配置项目特定的设置”。
如果您仍然有相同的java版本的错误:尝试手动删除项目的生成文件夹。然后重新启动eclipse。

相关问题