Maven编译打包过程(clean install)中遇到相关jdk版本导致的问题

来源:互联网 发布:sql server 2008 sa 编辑:程序博客网 时间:2024/06/16 16:21
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错误
问题描述:
  1. java.lang.UnsupportedClassVersionError: javax/servlet/ServletContext : Unsupported major.minor version 51.0  
  2.     at java.lang.ClassLoader.defineClass1(Native Method)  
  3.     at java.lang.ClassLoader.defineClassCond(ClassLoader.java:631)  
  4.     at java.lang.ClassLoader.defineClass(ClassLoader.java:615)  
  5.     at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141)  
  6.     at java.net.URLClassLoader.defineClass(URLClassLoader.java:283)  
  7.     at java.net.URLClassLoader.access$000(URLClassLoader.java:58)  
  8.     at java.net.URLClassLoader$1.run(URLClassLoader.java:197)  
  9.     at java.security.AccessController.doPrivileged(Native Method)  
  10.     at java.net.URLClassLoader.findClass(URLClassLoader.java:190)  
  11.     at java.lang.ClassLoader.loadClass(ClassLoader.java:306)  
  12.     at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)  
  13.     at java.lang.ClassLoader.loadClass(ClassLoader.java:247)  
  14.     at java.lang.Class.getDeclaredConstructors0(Native Method)  
  15.     at java.lang.Class.privateGetDeclaredConstructors(Class.java:2398)  
  16.     at java.lang.Class.getConstructor0(Class.java:2708)  
  17.     at java.lang.Class.getDeclaredConstructor(Class.java:1987)  
  18.     at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:105)  
  19.     at org.springframework.test.context.TestContextManager.retrieveTestExecutionListeners(TestContextManager.java:232)  
  20.     at org.springframework.test.context.TestContextManager.<init>(TestContextManager.java:120)  
  21.     at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTestContextManager(SpringJUnit4ClassRunner.java:120)  
  22.     at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.<init>(SpringJUnit4ClassRunner.java:109)  
  23.     at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)  
  24.     at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)  
  25.     at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)  
  26.     at java.lang.reflect.Constructor.newInstance(Constructor.java:513)  
  27.     at org.junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.java:29)  
  28.     at org.junit.internal.builders.AnnotatedBuilder.runnerForClass(AnnotatedBuilder.java:21)  
  29.     at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59)  
  30.     at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:26)  
  31.     at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59)  
  32.     at org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:26)  
  33.     at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.<init>(JUnit4TestReference.java:33)  
  34.     at org.eclipse.jdt.internal.junit4.runner.JUnit4TestClassReference.<init>(JUnit4TestClassReference.java:25)  
  35.     at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.createTest(JUnit4TestLoader.java:48)  
  36.     at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.loadTests(JUnit4TestLoader.java:38)  
  37.     at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:452)  
  38.     at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)  
  39.     at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)  
  40.     at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)  

原因是由于工程中使用到了servlet-api的jar包依赖,如下
  1. <dependency>  
  2.   <groupId>javax.servlet</groupId>  
  3.   <artifactId>javax.servlet-api</artifactId>  
  4.   <version>3.1.0</version>  
  5.   <scope>provided</scope>  
  6. </dependency>  

由于这个jar包是用jdk1.7编译的,我的工程是用jdk1.6,于是发生了以上错误。
ps:之前没写单元测试,开发环境都是部署在tomcat下测试的,由于这个jar包的scope是provider,意味着servlet-api不会部署到tomcat低下(打war包也不会打进去),而是用tomcat自身的servlet-api,所以没有发现以上错误。

解决方案:

把servlet-api的版本换成用jdk1.6编译的版本就可以了,我用的是
  1. <dependency>  
  2.   <groupId>javax.servlet</groupId>  
  3.   <artifactId>javax.servlet-api</artifactId>  
  4.   <version>3.0.1</version>  
  5.   <scope>provided</scope>  
  6. </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]



阅读全文
0 0
原创粉丝点击