java.lang.UnsupportedClassVersionError 不支持的 major.minor 版本号 51.0。

141

我正在尝试构建一个应用程序,但是它出现了一些错误。我的JDK版本如下:

java version "1.6.0_30"
Java(TM) SE Runtime Environment (build 1.6.0_30-b12)
Java HotSpot(TM) Client VM (build 20.5-b03, mixed mode, sharing)

以下是我的错误日志:

Buildfile: build.xml

compile:
     [echo] Compiling the service....
     [echo]   ...mkdir for classes first....
     [echo]   ...java classes next....
     [echo]   ...mkdir for generated code next....
     [echo]  ...generate stubs/skeletons next....
[wscompile] command line: wscompile -d /home/vivekray/program/MTrans/WEB-INF/classes -features:wsi,documentliteral -gen:server -keep -model /home/vivekray/program/MTrans/WEB-INF/model.gz -verbose -Xprintstacktrace /home/vivekray/program/MTrans/src/config.xml -classpath /home/vivekray/program/MTrans/WEB-INF:/home/vivekray/program/MTrans/WEB-INF/classes:/home/vivekray/program/MTrans/lib/log4j-1.2.16.jar:/home/vivekray/jwsdp-2.0/jwsdp-shared/lib/mail.jar:/home/vivekray/jwsdp-2.0/jwsdp-shared/lib/activation.jar:/home/vivekray/jwsdp-2.0/jaxp/lib/jaxp-api.jar:/home/vivekray/jwsdp-2.0/jaxp/lib/endorsed/dom.jar:/home/vivekray/jwsdp-2.0/jaxp/lib/endorsed/sax.jar:/home/vivekray/jwsdp-2.0/jaxp/lib/endorsed/xalan.jar:/home/vivekray/jwsdp-2.0/jaxp/lib/endorsed/xercesImpl.jar:/home/vivekray/jwsdp-2.0/jaxrpc/lib/jaxrpc-api.jar:/home/vivekray/jwsdp-2.0/jaxrpc/lib/jaxrpc-spi.jar:/home/vivekray/jwsdp-2.0/jaxrpc/lib/jaxrpc-impl.jar:/home/vivekray/jwsdp-2.0/saaj/lib/saaj-api.jar:/home/vivekray/jwsdp-2.0/saaj/lib/saaj-impl.jar:/home/vivekray/jwsdp-2.0/jwsdp-shared/lib/relaxngDatatype.jar:/home/vivekray/jwsdp-2.0/jwsdp-shared/lib/xsdlib.jar:/home/vivekray/jwsdp-2.0/jwsdp-shared/lib/jax-qname.jar:/home/vivekray/jwsdp-2.0/apache-ant/lib/ant.jar:/home/vivekray/jwsdp-2.0/fastinfoset/lib/FastInfoset.jar:/home/vivekray/Softwares/apache-tomcat-7.0.27/lib/servlet-api.jar
[wscompile] [creating model: mtransservice]
[wscompile] [creating service: Mtransservice]

BUILD FAILED
java.lang.UnsupportedClassVersionError: in/cdac/mobile/computing/mtrans/MtransService : Unsupported major.minor version 51.0
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClassCond(ClassLoader.java:631)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:615)
    at org.apache.tools.ant.AntClassLoader.defineClassFromData(AntClassLoader.java:1146)
    at org.apache.tools.ant.AntClassLoader.getClassFromStream(AntClassLoader.java:1324)
    at org.apache.tools.ant.AntClassLoader.findClassInComponents(AntClassLoader.java:1388)
    at org.apache.tools.ant.AntClassLoader.findClass(AntClassLoader.java:1341)
    at org.apache.tools.ant.AntClassLoader.loadClass(AntClassLoader.java:1088)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:295)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:247)
    at com.sun.xml.rpc.processor.modeler.rmi.RmiUtils.getLoadableClassName(RmiUtils.java:78)
    at com.sun.xml.rpc.processor.modeler.rmi.RmiUtils.getRealName(RmiUtils.java:54)
    at com.sun.xml.rpc.processor.modeler.rmi.RmiModeler.modelPort(RmiModeler.java:676)
    at com.sun.xml.rpc.processor.modeler.rmi.RmiModeler.buildLiteralModel(RmiModeler.java:603)
    at com.sun.xml.rpc.processor.modeler.rmi.RmiModeler.buildModel(RmiModeler.java:457)
    at com.sun.xml.rpc.processor.config.ModelInfo.buildModel(ModelInfo.java:88)
    at com.sun.xml.rpc.processor.Processor.runModeler(Processor.java:63)
    at com.sun.xml.rpc.tools.wscompile.CompileTool.run(CompileTool.java:714)
    at com.sun.xml.rpc.util.ToolBase.run(ToolBase.java:43)
    at com.sun.xml.rpc.tools.ant.Wscompile.execute(Wscompile.java:746)
    at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:288)
    at sun.reflect.GeneratedMethodAccessor3.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106)
    at org.apache.tools.ant.Task.perform(Task.java:348)
    at org.apache.tools.ant.Target.execute(Target.java:357)
    at org.apache.tools.ant.Target.performTasks(Target.java:385)
    at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1337)
    at org.apache.tools.ant.Project.executeTarget(Project.java:1306)
    at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:41)
    at org.apache.tools.ant.Project.executeTargets(Project.java:1189)
    at org.apache.tools.ant.Main.runBuild(Main.java:758)
    at org.apache.tools.ant.Main.startAnt(Main.java:217)
    at org.apache.tools.ant.launch.Launcher.run(Launcher.java:257)
    at org.apache.tools.ant.launch.Launcher.main(Launcher.java:104)

Total time: 1 second
7个回答

254

这些人告诉你失败的原因,但没有告诉你如何解决它。即使您已经拥有与您尝试的JVM匹配的JDK,此问题也可能出现。

项目 -> 属性 -> Java编译器

启用项目特定设置。

然后选择编译器兼容性级别为1.6或1.5,构建和测试您的应用程序。

现在应该没问题了。


11
你是真正的天才。其他回答只是解释问题,而没有描述如何解决这个问题。 - Zahid Riaz
在我的情况下,服务器正在运行Java 1.6,但Maven正在使用1.7。您可以反过来改变服务器运行时。无论如何,这是非常有帮助的答案! - mrak
1
这应该是被接受的答案。 - jpangamarca
非常感谢。在看到您的答案之前,我遇到了很多问题。我正在运行Java JRE 1.6.0,但编译版本设置为JRE 1.7.0。 - user4930716
此设置存储在 "<project folder>.settings/org.eclipse.jdt.core.prefs" 文件中。将其加入版本控制可能是个好主意(也可能不是)。 - fishjd
显示剩余5条评论

238

java.lang.UnsupportedClassVersionError的产生是因为在编译时使用了较高版本的JDK,而在运行时却使用了较低版本的JDK。

以下是各个版本的列表:

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

希望这可以帮到你: http://khyatisehgal.wordpress.com/2014/08/24/java-lang-unsupportedclassversionerror-unsupported-major-minor-version-51-0-at/ - Khyati Sehgal
在Eclipse中,您可能会无意中使用特定的兼容级别(右键单击->属性->Java编译器)覆盖本地捆绑属性。当您更改本地设置(窗口->首选项)时,这些捆绑包将不会自动“降级”。当您将捆绑包更改为在具有较低兼容级别的生产环境中工作时,有时可能会发生这种情况。 - keesp

18

4

当我使用jdk 1.7进行编译,然后使用jre 1.4执行时,我遇到了相同的问题。

我的解决方法是通过在现有PATH设置前添加路径名 C:\glassfish3\jdk7\bin 来设置环境变量PATH。更新后的值为“C:\glassfish3\jdk7\bin;C:\Sun\SDK\bin”。更新后,问题消失了。


4
这意味着你使用特定版本的JDK编译了你的类,但是在旧版本的JDK下尝试运行它们。

1
但是我只使用jdk-6.30,同一应用程序在其他系统上也可以在jdk-6.30上正常工作。 - vivek rai

2
使用Maven,并使用maven-compiler-plugin显式调用实际正确版本的JDK javac.exe命令,因为Maven可能正在运行任何版本;这也可以捕获javac中真正愚蠢的长期错误,在编译早期的Java版本时无法检测到运行时破坏类版本jars以及缺少的类/方法/属性!后面这部分本应该很容易在Java 1.5+中通过为新类、方法和属性添加版本属性或单独的编译器版本数据来修复,所以是Sun和Oracle非常愚蠢的疏忽。

6
OP没有使用Maven,为了解决这个问题而改变整个工具集似乎有些过度。尽管Maven很棒,但我认为这个回答离题了。 - Stijn de Witt

2

请确保在编译/运行时使用正确的SDK,并且确保使用源/目标1.7。


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