我使用intelliJ开发java代码,使用play1.3.4,开始配置的jdk是1.8;开发完代码之后(中间有调试),由于生产的jdk是1.7,因此我在本地安装了1.7然后,把intellij的jdk修改为1.7,把环境变量也修改为jdk1.7.0, 然后在本地启动play start
接着,我通过localhost:10000访问我的项目,报错如下:
Oops: UnsupportedClassVersionError
An unexpected error occured caused by exception UnsupportedClassVersionError: DocViewerPlugin : Unsupported major.minor version 52.0
1. 网上找了下相关问题
经过一番折腾,在网络上搜索了下,有一篇文章这么说的:
Similarly if you compile Java program in Java 1.7 it will create class file with major version 51.0 and if you run that on lower java version you will get java.lang.unsupportedclassversionerror unsupported major.minor version 51.0
链接:http://www.java67.com/2012/10/how-to-fix-javalangunsupportedclassversionerror-major-minor-version-49-50-51.html
基本确定是开发时,使用了52版本(java8)进行了编译;而跑程序时,runtime environment使用了52以下(即java7)的jdk。jdk版本不一致
2. 分析哪里会导致版本不一致
既然是编译时版本的问题,那就可能是我使用jdk1.8时造成的问题,但是play框架不需要我编译呀,为何有问题呢。
但是,play不需要developer编译,不意味着不需要编译,编译工作在用户首次请求时,会自动编译。(这也是为何首次进入系统,非常慢的原因)
而且,play是增量编译,即如果你某部分代码不修改,那么即使你用jdk1.7运行这个项目,没修改的部分,play是不会重新编译class文件的。
问题就在这里了,play生成的 DocViewerPlugin 我肯定没修改,所以它是第一次使用jdk1.8(version 52)编译时,就生成的。因此,一直报错An unexpected error occured caused by exception UnsupportedClassVersionError: DocViewerPlugin : Unsupported major.minor version 52.0
cd /mnt/project/module/tmp/classes
$ ls
controllers DocViewerPlugin.class dtos helpers models
3. 确认问题
回到原始的报错,我发现一个现象,controllers/xxx/directory/Clusters 源文件在我随便修改后,play就会增量编译了,而编译时的jdk是1.7,因此,我修改了一下代码,就不报错了,因为Clusters.class被重新用jdk1.7编译了。
而DocViewerPlugin 还是继续报错,因为我没改它呀。
play编译后的class文件会放到play项目的第一层的tmp目录中,和app一级
./app
./tmp
./lib
4. 解决方法:
进入模块目录,停止play
play stop
直接删除tmp目录,然后重建目录:
mkdir -p tmp
重新启动play,再次请求系统,问题解决。
play start
----最开始报错
@72jjhafbm
Internal Server Error (500) for request GET /
Oops: UnsupportedClassVersionError
An unexpected error occured caused by exception UnsupportedClassVersionError: DocViewerPlugin : Unsupported major.minor version 52.0
play.exceptions.UnexpectedException: Unexpected Error
at play.Invoker$Invocation.onException(Invoker.java:245)
at play.Invoker$Invocation.run(Invoker.java:305)
at Invocation.HTTP Request(Play!)
Caused by: java.lang.UnsupportedClassVersionError: DocViewerPlugin : Unsupported major.minor version 52.0
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:800)
at play.classloading.ApplicationClassloader.loadApplicationClass(ApplicationClassloader.java:152)
at play.classloading.ApplicationClassloader.loadClass(ApplicationClassloader.java:82)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
at play.plugins.PluginCollection.reloadApplicationPlugins(PluginCollection.java:204)
at play.Play.start(Play.java:482)
at play.Play.detectChanges(Play.java:641)
at play.Invoker$Invocation.init(Invoker.java:199)
... 1 more
[ERROR] 2017-01-09 18:06:35:846 [play.Logger][457] - Error during the 500 response generation
java.lang.UnsupportedClassVersionError: controllers/xxx/directory/Clusters : Unsupported major.minor version 52.0
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:800)
at play.classloading.ApplicationClassloader.loadApplicationClass(ApplicationClassloader.java:152)
at play.classloading.ApplicationClassloader.loadClass(ApplicationClassloader.java:82)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
at play.classloading.ApplicationClasses.getAssignableClasses(ApplicationClasses.java:71)
at play.classloading.ApplicationClassloader.getAssignableClasses(ApplicationClassloader.java:459)
at play.templates.GroovyTemplateCompiler.endTag(GroovyTemplateCompiler.java:360)
at play.templates.TemplateCompiler.generate(TemplateCompiler.java:93)
at play.templates.TemplateCompiler.compile(TemplateCompiler.java:15)
另附:
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