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

dsed 发布于 2019-01-09 incompatibility 最后更新 2019-01-09 20:07 65 浏览

我正在尝试使用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可能会老旧或太新。
  1. 我如何解决它?
  2. 我应该安装JDK,并将我的路径变量设置为JDK而不是JRE?
  3. JRE或JDK中的PATH变量有什么区别?
已邀请:

hea

赞同来自:

最常见的问题是您的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
The java-1.7.0-openjdk package contains just the Java Runtime Environment. If you want to develop Java programs then install the java-1.7.0-openjdk-devel package.

BSD FreeBSD Ports集合中有一个名为openjdk7的OpenJDK 7软件包,可能需要重新配置。 请参阅:OpenJDK wiki page

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

詹金斯 如果您遇到Jenkins的这个问题,请参阅: 但是,使用update-alternatives选择正确版本的Java(较新版本)应该可行。

ysunt

赞同来自:

对于Grails项目,我在Spring Source Tool(STS)IDE中遇到了同样的问题。我检查了已安装的Java版本,项目Java版本是1.7。*。后来我发现在GGTS.ini文件中Java版本设置为1.6: 解: -Dosgi.requiredJavaVersion = 1.6改为
-Dosgi.requiredJavaVersion = 1.7结果 在-vmargs之前添加以下两行 -vm结果 jdk1.7.0_21 / JRE / lib目录/ AMD64 /服务器/ libjvm.so 问题解决了。快乐的编码。

jdolor

赞同来自:

别担心,我解决了。 它实际上很简单 - 您需要使用相同的版本安装BOTH JRE / JDK。 JRE 6 - > JDK 6 JRE 7 - > JDK 7 等等。

iest

赞同来自:

当我恢复到Java 6并尝试运行以前使用Java 7编译的类时出现此问题。对我有用的是Preferences> java> compiler - >将合规性级别设置为1.6并且至关重要的是“配置项目设置”。

vvelit

赞同来自:

  1. 单击项目中的“属性”。
  2. 转到Java Build Path。
  3. 单击“添加库”。
  4. 在JRE系统库上单击“下一步”。如果未默认选择,请选择所需的一个。
  5. 单击“完成”。
你完成了!

dsit

赞同来自:

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

<target name="build-java" depends="prepare-build">
    <echo message="Compiling java files"/>
    <javac ....
           target="1.5"...
    </javac>
</target>
这对我有用,可以解决不受支持的主要小问题。

xipsam

赞同来自:

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

bsequi

赞同来自:

我遇到了一个问题,即我必须从命令行对我的项目运行Maven编译才能运行我的单元测试;如果我对测试类进行了更改并让Eclipse自动重新编译它,那么我得到了“Unsupported major.minor version 51.0”错误。 我确实安装了JDK6和JDK7,但我的所有JRE设置都指向1.6,它们都位于pom和Eclipse中的项目属性页面中。没有任何Maven更新项目和/或刷新解决了这个问题。 最后我尝试关闭项目并重新打开它,这似乎解决了它! HTH

nerror

赞同来自:

对我来说,我在com/sun/javadoc/Doclet类上遇到了这个错误。经过一番挖掘,我发现我不小心将Java 8中的tools.jar复制到我的Java 7文件夹中。 找到适用于Java 7的tools.jar并将其放回到该文件夹​​中解决了我的问题。所以要尝试一下。

jvitae

赞同来自:

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

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

iaut

赞同来自:

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

yhic

赞同来自:

How do I fix it?
此错误意味着用于执行类代码的JRE无法识别所使用的Java版本。通常是因为生成类文件(即编译它)的Java版本更新。 要解决它,你也可以 a)使用与运行它相同或较旧版本的Java编译器编译Java源代码。即安装适当的JDK。 b)使用较新版本的Java编译器编译Java源代码,但是在兼容模式下。即使用-target参数。 c)在与用于编译类的JDK相同或更新版本的JRE中运行已编译的类。 您可以检查当前使用的版本 javac -version用于编译器,java -version用于运行时。
Should I install the JDK, and setup my PATH variable to the JDK instead of JRE?
对于编译,当然,安装和配置所需的特定JDK。 对于运行时,您可以使用JDK附带的版本或独立的JRE,但无论如何,请确保您已安装了正确的版本并且已配置PATH,这样就不会出现意外情况。
What is the difference between the PATH variable in JRE or JDK?
PATH环境变量告诉命令shell在哪里查找您键入的命令。键入java时,命令shell解释程序将从左到右查看PATH变量中指定的所有位置,以查找要运行的相应java运行时可执行文件。如果您安装了多个Java版本 - 即您在PATH变量中指定的多个位置具有java可执行文件,那么从左到右遇到的第一个将是执行的那个。 编译器命令是javac,仅随JDK一起提供。运行时命令是java,随JDK一起提供,位于JRE中。 您可能安装了一个版本(51.0 = Java 7)的javac,并且您还安装了相同版本的java,但另一个先前版本的java出现在PATH的早期版本中,因此正在调用而不是一个你期望的。

oest

赞同来自:

您已使用更高版本的JDK进行编译并尝试从较低版本的JDK / JRE运行。 要检查这一点,请参阅版本信息:

javac -version
java -version
它们将是不同的,javac将具有更高的版本号。 要解决这个问题,请使用JDK版本中的java运行,或者如果您有更新的JRE / JDK也可以运行。 which javac会告诉您位置,例如/usr/bin/javac。只需使用/usr/bin/java <program>直接运行。 或者您可以将环境变量设置为永久解决方案。

ut_eos

赞同来自:

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

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

prem

赞同来自:

我通过检查部署程序集中是否部署了Maven依赖项来解决此问题。在我的情况下,他们不是。 添加它修复了问题。

qanimi

赞同来自:

  • 如果您使用Maven,请设置Java编译级别。打开命令行并为编译级写入java -versionEnter image description here
  • 如果您使用IntelliJ IDEA,请选择项目→文件→设置→构建执行部署→编译器→Java编译器。然后将字节代码更改为1.7,如下图所示: Enter image description here

afuga

赞同来自:

如果有人在使用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>
       .....

ut_et

赞同来自:

另一种在安装了Homebrew的Mac OS X上修复此问题的方法是:

brew install Caskroom/cask/java

miure

赞同来自:

今天,我们在Ubuntu 12.04.2 LTS(精确穿山甲)上的Tomcat 7中出现了此错误消息:

/var/log/tomcat7/localhost.2014-04-08.log:
Apr 8, 2014 9:00:55 AM org.apache.catalina.core.StandardContext filterStart
SEVERE: Exception starting filter struts2
java.lang.UnsupportedClassVersionError: controller/ReqAccept : Unsupported major.minor version 51.0 (unable to load class 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"

xillum

赞同来自:

首先让我们了解一些基础... JRE是NetBeans / Eclipse / standalone中的一个组件,它将为您提供库,JVM,Java插件和组件。 Java web start。请注意,它不提供编译器或调试器。 JDK是JRE的超集以及编译器和调试器。 因此,当您将默认库作为JRE而不是JDK时,您将有一个很好的时间导入内容,但它不会编译。 相反,设置您的JDK路径(我使用NetBeans,并使用netbeans / etc / netbeans.conf中的netbeans.conf设置它们并更改路径)。

aut_ea

赞同来自:

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

cnon

赞同来自:

我尝试了一切。重新安装Tomcat是最终的工作。这是我在重新安装之前检查过的内容。 确保您的环境变量如下所示。

$ echo $JAVA_HOME
C:\Program Files\Java\jdk1.7.0_51\
$ echo $JRE_HOME
C:\Program Files\Java\jdk1.7.0_51\jre\bin
确保Eclipse使用与您设置JAVA_HOME相同的jre(如果未设置JAVA_HOME,它将查看JRE_HOME)。 Window > Prefrences > Java > Installed JREs(选中的是默认值) 如果您对任何tomcat文件进行了任何更改,尤其是catalina.bat或startup.bat,那么您可能会告诉tomcat查看不同版本的java而不是您设置为JAVA_HOME C:\Program Files (x86)\Apache\apache-tomcat-7.0.26\bin的版本

dipsam

赞同来自:

  • 安装JDK 7.0.55并为JDK 7.0.55设置Java for Eclipse
  • 通过在构建路径JDK 7.0.55上配置来使用JDK 7.0.55构建项目。
  • 通过菜单Windows - > Preferences - > Java - > Compiler - 选择1.7,在Eclipse中为JDK 7.0.55设置编译器。

nodio

赞同来自:

我正在使用OS X v10.11.5(El Capitan),我尝试通过Maven设置JAVA_HOME并强制使用“正确”的Java版本。什么都没有帮助。 在应用程序仍在运行时注销OS X帐户时发生问题。再次登录后,OS  X打开旧的终端会话,显示灰色历史记录。我使用相同的终端会话来构建项目,但由于不支持的类版本错误而失败。 清理Maven项目根本没有帮助。 要解决这个问题,我只需关闭自动打开的终端窗口并使用新的终端窗口。

zamet

赞同来自:

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

wet

赞同来自:

在Eclipse的菜单窗口 - >首选项 - > Java - >编译器中也检查“配置项目特定设置”。 如果您使用相同的Java版本存在错误:尝试手动删除项目的构建文件夹。然后重启Eclipse。

lut

赞同来自:

我在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 file is a hidden file. It is an optional file which tells the system which commands to run when the user whose profile file it is logs in. For example, if my username is bruno and there is a .profile file in /Users/bruno/, all of its contents will be executed during the log-in procedure.
资料来源:http://computers.tutsplus.com/tutorials/speed-up-your-terminal-workflow-with-command-aliases-and-profile--mac-30515

xesse

赞同来自:

将其添加到您的pom.xml文件中:

<project ....>
    <properties>
        <maven.compiler.source>1.7</maven.compiler.source>
        <maven.compiler.target>1.7</maven.compiler.target>
    </properties>
</project>
其中1.7是您打算使用的Java版本。这会覆盖Maven编译器设置,因此最好从此处进行调试。

frerum

赞同来自:

我在1.7中编写的项目遇到了同样的问题,并试图在1.6中执行。 我在Eclipse中的解决方案:

  • 右键单击Project Properties - > Java Build Path - > Libraries
  • 选择您的JRE系统库,然后单击右侧的编辑,然后选择目标JRE。
  • 现在转到左侧的Java Compiler,并将Compiler合规性级别更改为您的目标。
这对我有用。

hquae

赞同来自:

从Eclipse运行Ant时我有相同的错误消息,但这里提到的其他解决方案并没有解决我的问题。有趣的是,从Windows命令行运行Ant运行正常,因此它必须是Eclipse中的配置问题。 事实证明,在Eclipse下,您可以指定Ant应该运行的环境,并将其设置为JRE而不是JDK。

  • 转到:运行 - >外部工具 - >外部工具配置...
  • 为项目选择Ant build.xml(如果您有多个项目)
  • 激活标签'JRE'
  • 这里选择了'Separate JRE:jre6'。当我从1.6或1.7系列更改为JDK时,错误消失了。

cvelit

赞同来自:

基于此......

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。

lipsum

赞同来自:

此错误意味着您正在尝试加载使用比您安装的Java更新版本编译的Java“类”文件。 例如,您的.class文件可能已经为JDK 7编译,并且您尝试使用JDK 6运行它。 所以解决方案是:

  • 升级Java运行时或
  • 如果您有源,请使用本地Java编译器(如果有的话)重新编译该类。 javac FileName.java
对于开发人员来说,如果另一个开发人员签入.class文件,并且他们有一个比你更新的java版本,就会发生这种情况!

sit_id

赞同来自:

您正在尝试使用不支持编译代码的版本的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

et_id

赞同来自:

我遇到了同样的问题,我在Linux中修复了它。 检查您的$JAVA_HOME 需要JDK 1.8来编译/构建APK 安装Java JDK 1.8并更改JAVA_HOME 编辑~/.bashrc并将JDK 1.8路径添加为JAVA_HOMEexport JAVA_HOME=/usr/lib/jvm/java-8-oracle/jre/source ~/.bashrc 关闭当前终端窗口/选项卡并运行$JAVA_HOME以检查路径。

qanimi

赞同来自:

我遇到了同样的问题,我在Mac上通过this solution解决了这个问题。我希望它对某人有帮助。这是因为系统不知道更新版本的JDK,它仍然指向旧的JDK。

nipsa

赞同来自:

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

riure

赞同来自:

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

nea

赞同来自:

如果您在构建路径中添加了第二个项目,请确保它与第一个项目具有相同的编译器版本: 属性 - > Java编译器 - >编译器合规性级别

adolor

赞同来自:

我解决了我跑了:

JAVA_HOME=/usr/lib/jvm/java-7-openjdk-i386
该错误具有误导性,Unsupported major.minor version 51.0。这给人的印象是不支持版本51(Java 7)。我们应该使用Java 6。 该错误应该是:
The current Java version, 50, is unsupported. Use Java version 7 (51:0 and greater) instead.`

ueos

赞同来自:

我有相同的情况,但上述任何提示都没有帮助:)在我们的环境中,我们在Windows上运行tomcat作为服务。我们安装了Java 1.7并在此版本上设置了JAVA_HOME。当然,源代码是基于Java 1.7构建的。尽管如此,tomcat表示它使用的是以前版本的JVM。经过深入分析后,Windows上安装的Tomcat服务仍然保持JAVA_HOME的旧值指向Java 1.6。安装新的Tomcat服务后,一切都解决了。 所以结论是:当你改变java版本和tomcat作为服务运行时,你必须重新安装tomcat服务。

peum

赞同来自:

您的Java文件使用与您尝试运行它的版本(较低的运行时版本)不同的版本(更高的编译器版本)进行编译。 基本的理解是,使用较低版本编译的类应该在更高版本中运行。但相反(使用更高的编译器版本编译并尝试以较低的运行时版本运行它)有时是不可能的。 因此,在尝试执行程序时会显示此错误。不支持的major.minor版本x.x.

Q: I have created an application in Java 7, but when my users try to run it they get an Unsupported major.minor version 51.0 error. What does this mean and what can I do about it? A: If you compile an application using javac in Java 7, the resulting classfiles will have the 51.0 version number. Versions of Java prior to 7 do not recognize this number, so your users will have to upgrade to Java 7 prior to running your application. If you are not using any Java 7 APIs you can try to compile your application using javac -target 1.6 to create a 1.6-compatible classfile. If your application is deployed using webstart you can specify the minimum version required. For more information, see the docs on Java Web Start and JNLP here. This issue will go away once we trigger autoupdate to Java 7 for end-users currently having Java 6 on their desktops. The timeline for this is not yet determined, we want to give developers time to work out any issues between their code and JDK 7 first.
(来源:oracle.com。)

要回复问题请先登录注册