首页 文章

如何修复java.lang.UnsupportedClassVersionError:不支持的major.minor版本

提问于
浏览
1436

我正在尝试使用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 回答

  • 21

    当我恢复到Java 6并尝试运行以前使用Java 7编译的类时出现此问题 . 对我有用的是Preferences> java> compiler - > set compliance级别为1.6,关键是“配置项目设置”..

  • 12

    当我安装JDK 1.7时,问题就解决了 .

  • 5

    在我的情况下,问题出在服务器运行时配置中:

    Server Runtime Environment

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

    enter image description here

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

  • 3

    我在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文件,则其所有内容将在登录过程中执行 .

    资料来源:http://computers.tutsplus.com/tutorials/speed-up-your-terminal-workflow-with-command-aliases-and-profile--mac-30515

  • 336

    别担心,我解决了 .

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

    JRE 6 - > JDK 6

    JRE 7 - > JDK 7

    等等 .

  • 8

    发生 java.lang.UnsupportedClassVersionError 是因为编译期间JDK较高,运行时期间JDK较低 .

  • 8

    您正在尝试使用不支持编译代码的版本的Java版本来运行程序 . So basically you must have compiled your code with a higher version and trying to run it using a lower version.

    当你得到

    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 .

  • 3

    显示的版本号描述了类文件兼容的JRE的版本 .

    报告的主要数字是:

    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 .

  • 56

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

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

    javac -version
    
    java -version
    

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

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

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

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

  • 16

    我该如何解决?

    此错误意味着用于执行类代码的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中 .

    您可能安装了一个版本(51.0 = Java 7) javac ,并且您也拥有相同版本的 java 已安装,但是另一个先前版本的 java 出现在PATH的前面,因此正在调用而不是您期望的版本 .

  • 39

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

  • 6

    在Eclipse的菜单窗口 - >首选项 - > Java - >编译器中也检查"Configure Project Specific Settings" .

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

  • 3

    最常见的问题是 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 Runtime Environment . 如果要开发Java程序,请安装java-1.7.0-openjdk-devel软件包 .

    BSD

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

    见:OpenJDK wiki page .

    Windows

    只需从Oracle site安装适当的Java SE Development Kit库或安装即可

    詹金斯

    如果您遇到Jenkins的这个问题,请参阅:

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

  • 1818

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

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

    Enter image description here

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

    Enter image description here

  • 18

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

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

    因此,在尝试执行程序时会显示此错误 . Unsupported major.minor version 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 . )

  • 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中的项目:

    Build Path - > Configure Build Path

    下:

    Java Build Path - > Libraries - > Add Library - > JRE System Library - > Installed JREs - > Search .

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

  • 113

    如果您在使用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,请将 sourcetarget 设置为 1.8 .

  • 12

    今天,这个错误信息出现在Ubuntu 12.04.2 LTSUbuntu 12.04.2 LTS(精确穿山甲):

    /var/log/tomcat7/localhost.2014-04-08.log:Apr8,2014 9:00:55 AM org.apache.catalina.core.StandardContext filterStart SEVERE:异常启动过滤器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 version“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 version“1.7.0_15”

  • 12

    我解决了我跑了:

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

  • 10

    首先让我们了解一些基础知识......

    JRE是NetBeans / Eclipse / standalone中的一个组件,它将为您提供库,JVM,Java插件和Java Web启动 . 请注意,它不提供编译器或调试器 .

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

    因此,当您将默认库作为JRE而不是JDK时,您将有一个很好的时间导入内容,但它不会编译 .

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

  • 10

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

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

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

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

    • 激活标签'JRE'

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

  • 8

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

    我在Eclipse中的解决方案:

    • 右键单击您的项目 Properties -> Java Build Path -> Libraries

    • 选择您的JRE系统库并单击右侧的 Edit ,然后选择目标JRE .

    • 现在转到左侧的 Java Compiler ,然后将 Compiler compliance level 更改为目标 .

    这对我有用 .

  • 7

    当我使用Ant脚本来构建我的应用程序时,我遇到了同样的问题 .

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

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

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

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

  • 6

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

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

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

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

    所以解决方案是:

    • 升级Java运行时或

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

    javac FileName.java

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

  • 5

    在Eclipse中,我只是转到菜单命令Window - > Preferences - > Java - > Compiler,然后将"Compiler compliance level"设置为1.6 .

  • 4

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

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

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

  • 3
    • 安装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设置编译器 .

  • 14

    正如几个人在其他地方所解释的那样,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
    

相关问题