深⼊理解java版本兼容问题
我们在做dubbo接⼝开发是,要考虑jdk版本兼容的问题。如果是⾼版本的jre运⾏低版本jdk compile 的jar,根据java的向下兼容性,这个没有问题。但如果是低版本jre运⾏⾼版本的jdk compile的jar,会怎么样呢?
问题的背景
最近在做项⽬时,由于要⽤到elastichsearch 做开发,elastichsearch 的jdk版本是java7,⽽公司要求的java版本⼀般来说是java6,当时想java7 的jre可以运⾏java6 compile的jar包,应该没有什么问题。后来在发布duboo接⼝到maven私库上时,发现问题了,如果⽤java7 compile jar 包到maven私库上,调⽤⽅如果使⽤的是java6,能正常运⾏吗?在和同事讨论时,⼤体上有两种观点
* 如果没有使⽤java7 的 feature,则java1.6的jre可以运⾏jdk1.7 compile 的jar包
* java1.6不能运⾏java7 compile 的jar包
到底哪种说法是正确的呢?
看看官⽅⽂档怎么说
我从oracle 到了⼀份java8 compatible document
Binary Compatibility
Java SE 8 is binary-compatible with Java SE 7 except for the incompatibilities listed below. Except for the noted incompatibilities, class files built with the Java SE 7 compiler will run correctly in Java SE 8. Class files built with the Java SE 8 compiler will not run on earlier releases of Java SE.
官⽅⽂档的意思是:同⼀份代码,⽤java8打包的jar,不能在java7上运⾏,反之可以。
那我们来试⼀试吧,看java7打包jar, mvn clean install 到本地 ,然后,⽤另外⼀个项⽬来调⽤,会怎么样?
我们启动⼀个调⽤⽅的项⽬
StagePayBusinessTO : Unsupported major.minor version 51.0
程序在运⾏时报错了
maven打包本地jar包所以,我们得出⼀个结论,⾼版本编译的java代码,在低版本⽆法运⾏.那么,现在另外⼀个问题来了,
如果项⽬的jdk是java7的,但jsf接⼝的API必须是java6的,如果哪天不⼩⼼,mvn deploy时⽤java7的编译打包后传到了maven私库上,调⽤⽅如果使⽤的是jre1.6的版本,当下载你的⾼版本编译的依赖jar包后,直接导致程序⽆法启动,这个怎么办呢?
重新认识maven-compiler-plugin 插件
笔者之前,⼀直认为configuration的source,target中的数值是约束jdk版本的,只要本地jdk版本⼤于等于这个数值就⾏。⽐如,这个数值是1.6,那么只要jdk版本⼤于等于1.6,就可以编译,如果jdk版本是1.7,则是⽣成的是jdk1.7规范的class⽂件,如果jdk是1.6,则⽣成的是jdk1.6规范的class⽂件。笔者认真看了⼀下这个插件的⽂档,发现source和target是javac 在编译时要传的参数。我在官⽅⽹站上到了关于source和target的说明,source不⽤介绍了,我们重点看⼀下target的说明。
-target version Generate class files that target a specified version of the VM. Class files will run on the specified target and on later versions, but not on earlier versions of the VM. Valid targets are 1.1, 1.2, 1.3, 1.4, 1.5 (also 5), 1.6 (also 6), and 1.7 (also 7).
The default for -target depends on the value of -source:
If -source is not specified, the value of -target is 1.7
If -source is 1.2, the value of -target is 1.4
If -source is 1.3, the value of -target is 1.4
If -source is 1.5, the value of -target is 1.7
If -source is 1.6, the value of -target is 1.7
For all other values of -source, the value of -target is the value of -source.
从以上说明中我们可以看出,target配置多少,就⽤哪个jdk版本的规范⽂件。⽐如,你是java7的编译器,如果target是1.6,则⽣成
java1.6规范的class⽂件。 有了这个插件,我们在jsf 接⼝发布的时候,只需要在API ⼦项⽬的pm.xml中配置好1.6,就可以了,再也不⽤担⼼因为是java1.7的编译器⽽把JSF接⼝的jar 编译成java1.7规范的class了。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论