java.lang.UnsupportedClassVersionError: .class文件中的版本号错误?

142

我在包含我必须从源代码编译的开源库时遇到了这个错误。现在,网络上的所有建议都表明代码是在一个版本中编译的,而在另一个版本中执行的(新版本在旧版本上)。然而,我的系统上只有一个版本的JRE。如果我运行以下命令:

$ javac -version
javac 1.5.0_18

$ java -version
java version "1.5.0_18"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_18-b02)
Java HotSpot(TM) Server VM (build 1.5.0_18-b02, mixed mode)

当我在 Eclipse 中检查 Java 库的属性时,得到的版本是 1.5.0_18

因此,我必须得出另一个结论:是类内部自身引起了异常吗?这真的可能吗?


2
你是否有编译好的库版本在其他地方,可能会先出现在你的类路径上? - Jeff Storey
好主意,但不行。我已经通过在JAR文件夹中使用“find . -name '*.jar' | xargs locate”进行了检查。此外,我认为Eclipse没有使用CLASSPATH?还有其他好的建议吗? - grmn.bob
如何在cmd上使用find -name '*.jar'命令,因为我正在寻找重新构建jre src代码所需的命令...为此,我需要运行这个cmd.....http://www.javalobby.org/java/forums/t103334.html.....我的jdk位于C:\Program Files\Java\jdk1.6.0_31。 - lowLatency
10个回答

186

我了解到这样的错误消息通常是正确的。当你认为被报告的错误不可能是真正的问题时,你会去寻找另一个区域的问题……但几个小时后才发现原始的错误消息确实是正确的。

由于你正在使用Eclipse,我认为Thilo是正确的,你收到此消息的最有可能的原因是你的项目中编译了1.6类。即使系统上只有1.5 JRE,也没有关系,因为Eclipse有自己的编译器(而不是javac),只需要1.5 JRE来编译1.6类。虽然这可能很奇怪,需要取消选中某个设置才能允许它,但我刚刚设法做到了。

对于相关的项目,请检查项目属性(通常是Alt+Enter),Java编译器部分。下面是一个配置为编译1.6但只使用1.5 JRE的项目图像:

输入图片描述


3
如果你有JDK(其中包括源代码),你应该能够在Eclipse中添加一些断点,并希望看到它正在尝试加载哪个类。最简单的方法可能是在UnsupportedClassVersionError构造函数中设置一个断点(或者是Eclipse异常断点,即“J!”图标),然后你就可以检查它是如何到达那里的。 - Joshua McKinnon
2
我曾经遇到过同样的问题。我的错误在于我使用了1.5 JRE和1.6编译器,这并没有解决unsupportedclassversion错误。所以我在我的eclipse中安装了1.6 JRE并使用了1.6编译器。然后一切都开始正常工作了。 - Vanchinathan Chandrasekaran
很好的答案。我有一些xServer不会升级到1.6。谁能想到! - Jim Geldermann
谢谢!我愚蠢地认为构建路径上的jre被使用了。另外,有人能解释一下为什么我的eclipse中的“使用执行环境的合规性”行是灰色的吗? - Adam
如果你和我一样,在使用Eclipse和ANT时遇到了这个问题,请确保检查项目属性- Java编译器Eclipse首选项- Java-编译器Java-已安装的JRE以及外部工具配置-JRE - Lucas Hoepner
显示剩余2条评论

9

您尝试过在Eclipse中进行完整的“清理”后再重新构建吗(项目->清理...)?

您能否直接从命令行使用“javac”和“java”进行编译和运行? 这是否正常工作?

如果您右键单击项目,转到“属性”,然后转到“Java构建路径”,是否有任何可疑条目在任何选项卡下? 这基本上是您的CLASSPATH。

在Eclipse首选项中,您还可以在“Java”部分的“已安装JRE”部分中仔细检查并确保其与您想要的匹配。

您肯定要么有一个过期的.class文件仍然存在,要么您正在使用不同版本的Java进行编译时/运行时不匹配。


是的(完全干净);我还没有尝试过它(从命令行项目);可能/不(我从Eclipse“Java Build Path”中删除了条目);我做到了(JREs - 那就是我得到版本号的地方)。 - grmn.bob

5

你是用Eclipse编译的吗?它使用不同的编译器(不是javac)。如果一切配置正确,这不应该导致此错误,但您可以尝试改用javac进行编译。

如果问题得到解决,请检查Eclipse是否有一些不正确的编译器设置。具体来说,将其目标设置为Java 5。


这就是我正在学习的内容。我将尝试以相同的方式构建这两个部分(命令行和/或eclipse)。 - grmn.bob

2

我也遇到了同样的错误。原因是我使用Maven编译项目。我的JAVA_HOME指向JDK7,因此在编译时使用了java 1.7,而在运行项目时使用的是JDK1.5。更改.classpath文件中的以下条目或在Eclipse中进行如下截图所示的更改即可解决问题。

classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5

或者在Eclipse的运行配置中进行更改,如下图所示: enter image description here


1

同时检查项目中编译为更高版本Java的任何jar文件。如果这些是您自己的库,则可以通过将目标版本属性更改为javac来解决此问题。

<javac destdir="${classes.dir}"
            debug="on" classpathref="project.classpath" target="1.6">

0

始终要检查显而易见的问题。我曾经因为不小心选择了错误的资源用于服务器的添加和删除操作而出现了这个错误。很容易被忽视。


0

将项目更改为使用Java 1.7:要使其工作,请按照以下步骤进行:

  • 更改编译器兼容性级别
  • 将您的项目JRE / JDK更改为相同级别(在我的情况下为1.7)
  • 对您的项目引用的所有项目进行相同的更改
  • 更改运行/调试配置以使用JRE / JDK(或相同级别)

还不起作用?

  • 删除项目Bin目录
  • 清理
  • 重新构建

仍然不起作用?

在您的项目目录中:编辑.settings/org.eclipse.jdt.core.prefs>确保应用了您的目标级别

祝你好运!


0
从项目文件夹中删除特定于项目的设置文件(Eclipse工作区/项目文件夹/.settings/)也可以。显然,在删除后我们需要进行项目清理和构建。

0
另一种可能发生这种情况的场景是,当您从主机Eclipse启动Eclipse实例(用于调试等)时 - 在这种情况下,仅更改项目类路径上的项目级别或JRE库是无法解决问题的。重要的是使用哪个JRE来启动目标Eclipse环境。

0
我通过更改服务器所需的JRE(在我的情况下是Tomcat)来解决了这个问题。 在Eclipse的Server选项卡中,双击服务器(以打开服务器配置页面),单击运行时环境,然后更改所需的JRE。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接