java使用不同的JDK版本构建:相同的工件?

web*_*sen 1 java

这是我的情景:

  • 工作站A:Sun JDK 1.6
  • 工作站B:Sun JDK 1.5

我用Ant 1.7构建A和B.

<javac srcdir="${foo}" destdir="${bar}" source="1.5" target="1.5">
  <include name="**/*.java"/>
  <exclude name="**/test/**/*.java"/>
</javac>
Run Code Online (Sandbox Code Playgroud)

然而.class文件在A和B上的大小不同,更不用说CRC了.是应该这样吗?还是我错过了一些明显的东西?

eri*_*son 5

是的,它应该是这样的.即使针对同一个VM,不同的编译器也可能会发出不同的字节代码.只要生成的程序行为正确,JLS就不会精确地命令如何将源代码编译为字节代码.


mat*_*t b 5

虽然你可能明确设置source="1.5"target="1.5",但这不是控制你正在运行javac编译器的哪个JDK版本.

因此,在具有JAVA_HOME/ PATH指向JDK 1.6 的工作站上,您具有基于1.6 javac构建的类文件,该文件应与1.5 JRE兼容.

然而,source="1.5"target="1.5"只指定的语法/语言功能的兼容性; 如果您依赖于仅在1.6 JRE中可用的某些类,那么在使用source="1.5"target="1.5"使用1.6 javac 时,您将不会收到任何编译器警告.

要解决最后一点,您需要告诉<javac>Ant任务使用不同的任务bootclasspath.