公司有2套JDK编译环境,一个是1.6,一个是1.4
运行时环境都是一样的, Tomcat 6 + JRE 1.6
实际问题是开发过程中经常碰到开发提交的代码本地是编译ok的,但是QA编译机编译不通过.
问题就出在环境里JDK版本不同上.
开发机: JDK 1.6.
编译脚本:
<javac debug="on" encoding="UTF-8" deprecation="on" source="1.4" target="1.4" destdir="${build.dir}">
QA编译机: JDK 1.4
<javac debug="on" encoding="UTF-8" deprecation="on" destdir="${build.dir}">
原以为两者是等价的,其实完全不一样.
JDK1.4的不能识别用1.6编译的jar,所以一旦需要编译的java源文件引用到了1.6的jar,编译就不通过.
解决方法: 凡是旧的环境, 需要用JDK1.4编译的, 依赖jar也都必须是1.4编译出来的.
同时也研究了下JDK编译 -source -target的具体含义:
-source 确认编译语言的语法,比如设置为1.4则1.5的新特性比如泛型都不能用,编译不通过
-target 确定最低兼容的VM版本, 设置-source=1.6 -target=1.4 可以让JDK1.6编译出来的class/jar运行在JRE1.4环境. (注意target版本必须高于source)
但这是不保险的,如果VM真的是1.4,还是建议用JDK1.4编译
比如BigDecimal是JDk1.5的,但是仍然可以通过-target编译出来.
查看class的jdk版本
打开二进制的.class文件,查看头部第8个byte:
CA FE BA BE 00 00 00 30
0x2D | 45 | JDK 1.1 |
0x2E | 46 | JDK 1.2 |
0x2F | 47 | JDK 1.3 |
0x30 | 48 | JDK 1.4 |
0x31 | 49 | J2SE 5.0 |
0x32 | 50 | J2SE 6.0 |
0x33 | 51 | J2SE 7 |
0x34 | 52 | J2SE 8 |
参考文章:
javac - Java programming language compiler
http://docs.oracle.com/javase/6/docs/technotes/tools/windows/javac.html
Java class file
http://en.wikipedia.org/wiki/Java_class_file