Unsupported major.minor version 51.0 解决方案
在日常开发中遇到:时抛出异常Unsupported major.minor version 51.0
1: 一种是maven版本太高,而你编译使用的jdk版本太低导致
2: 一种是项目中编译时,使用jdk编译太低,而项目中引用的相关jar包编译的jdk版本太高导致
使用eclipse Mars.2 Release (4.5.2)版本, 用的Maven版本为:3.3.9,但是我执行一个简单的clean命令会报如下错误:
Exception in thread "main" java.lang.UnsupportedClassVersionError: org/apache/maven/cli/MavenCli : 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 java.security.SecureClassLoader.defineClass(SecureClassLoader.java: 141 ) at java.net.URLClassLoader.defineClass(URLClassLoader.java: 283 ) at java.net.URLClassLoader.access$ 000(URLClassLoader.java:58 ) at java.net.URLClassLoader$ 1.run(URLClassLoader.java:197 ) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java: 190 ) at org.codehaus.plexus.classworlds.realm.ClassRealm.loadClassFromSelf(ClassRealm.java: 401 ) at org.codehaus.plexus.classworlds.strategy.SelfFirstStrategy.loadClass(SelfFirstStrategy.java: 42 ) at org.codehaus.plexus.classworlds.realm.ClassRealm.unsynchronizedLoadClass(ClassRealm.java: 271 ) at org.codehaus.plexus.classworlds.realm.ClassRealm.loadClass(ClassRealm.java: 254 ) at org.codehaus.plexus.classworlds.realm.ClassRealm.loadClass(ClassRealm.java: 239 ) at org.codehaus.plexus.classworlds.launcher.Launcher.getMainClass(Launcher.java: 144 ) at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java: 266 ) at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java: 229 ) at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java: 415 ) at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java: 356 ) at org.codehaus.classworlds.Launcher.main(Launcher.java: 47 ) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java: 39 ) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java: 25 ) at java.lang.reflect.Method.invoke(Method.java: 597 ) at com.intellij.rt.execution.application.AppMain.main(AppMain.java: 144)
去网上搜了下,说是jdk版本问题,后来去官网看了一下,就明白了!

原来Maven的不同版本对Jdk的版本是有要求的,因为公司的jdk是1.6的,所以果断下了个3.2.5版,一切就正常了。
Unsupported major.minor version 51.0错误,百度一查是因为 低版本的 JVM 无法加载高版本的 class 文件造成 的,翻译为:不支持的版本major.minor version 51.0 。major.minor version 51.0,表示jdk版本为1.7(类似,50.0表示1.6,49.0表示1.5....),
运行junit测试报javax/servlet/ServletContext : Unsupported major.minor version 51.0错误
问题描述:
- java.lang.UnsupportedClassVersionError: javax/servlet/ServletContext : 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 java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141)
- at java.net.URLClassLoader.defineClass(URLClassLoader.java:283)
- at java.net.URLClassLoader.access$000(URLClassLoader.java:58)
- at java.net.URLClassLoader$1.run(URLClassLoader.java:197)
- at java.security.AccessController.doPrivileged(Native Method)
- at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
- at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
- at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
- at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
- at java.lang.Class.getDeclaredConstructors0(Native Method)
- at java.lang.Class.privateGetDeclaredConstructors(Class.java:2398)
- at java.lang.Class.getConstructor0(Class.java:2708)
- at java.lang.Class.getDeclaredConstructor(Class.java:1987)
- at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:105)
- at org.springframework.test.context.TestContextManager.retrieveTestExecutionListeners(TestContextManager.java:232)
- at org.springframework.test.context.TestContextManager.<init>(TestContextManager.java:120)
- at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTestContextManager(SpringJUnit4ClassRunner.java:120)
- at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.<init>(SpringJUnit4ClassRunner.java:109)
- at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
- at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
- at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
- at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
- at org.junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.java:29)
- at org.junit.internal.builders.AnnotatedBuilder.runnerForClass(AnnotatedBuilder.java:21)
- at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59)
- at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:26)
- at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59)
- at org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:26)
- at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.<init>(JUnit4TestReference.java:33)
- at org.eclipse.jdt.internal.junit4.runner.JUnit4TestClassReference.<init>(JUnit4TestClassReference.java:25)
- at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.createTest(JUnit4TestLoader.java:48)
- at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.loadTests(JUnit4TestLoader.java:38)
- at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:452)
- at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
- at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
- at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
原因是由于工程中使用到了servlet-api的jar包依赖,如下
- <dependency>
- <groupId>javax.servlet</groupId>
- <artifactId>javax.servlet-api</artifactId>
- <version>3.1.0</version>
- <scope>provided</scope>
- </dependency>
由于这个jar包是用jdk1.7编译的,我的工程是用jdk1.6,于是发生了以上错误。
ps:之前没写单元测试,开发环境都是部署在tomcat下测试的,由于这个jar包的scope是provider,意味着servlet-api不会部署到tomcat低下(打war包也不会打进去),而是用tomcat自身的servlet-api,所以没有发现以上错误。
解决方案:
把servlet-api的版本换成用jdk1.6编译的版本就可以了,我用的是
- <dependency>
- <groupId>javax.servlet</groupId>
- <artifactId>javax.servlet-api</artifactId>
- <version>3.0.1</version>
- <scope>provided</scope>
- </dependency>
类似有:
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:2.3.2:compile (default-compile) on project ppay-export: Compilation failure
[ERROR] Failure executing javac, but could not parse the error:
[ERROR] 错误:构造处理程序对象 org/apache/logging/log4j/core/config/plugins/processor/PluginProcessor : Unsupported major.minor version 51.0 时抛出异常
[ERROR] -> [Help 1]
[ERROR] Failure executing javac, but could not parse the error:
[ERROR] 错误:构造处理程序对象 org/apache/logging/log4j/core/config/plugins/processor/PluginProcessor : Unsupported major.minor version 51.0 时抛出异常
[ERROR] -> [Help 1]
版权声明:本文为u013833031原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。