哪个JDK的发行版可以运行`javac -source 1.6 -target 1.5`?

Tho*_*sen 3 java linux ubuntu javac

注:请不要上交叉编译的所有危险评.谢谢.


我有一种情况,我们需要为Java 5 JVM编译Java 6源代码(以确保JAX-WS的使用是正确的).以前我们用ant ant脚本(显然可以)这样做了,但是在迁移到Maven之后我们发现它最终以javac抱怨:

$ javac -source 1.6 -target 1.5
javac: source release 1.6 requires target release 1.6
Run Code Online (Sandbox Code Playgroud)

是否有任何对Linux(Ubuntu的11.10,86),其中使用javac可以做到这一点的Java分配?


编辑:它似乎没有,因为限制在javac是相同的.解决方案(这使得需要消失)是从默认的javac编译器改为maven-compiler-plugin中的eclipse编译器.


编辑:我发现Eclipse编译器为javadoc实用程序不同意的匿名内部类生成字节代码.我正在为此问题准备一份错误报告.

Aar*_*lla 6

根据文档(Java 5,Java 6),当您按照交叉编译示例中的说明操作时,Oracle SDK应该能够执行此操作.

Java 6应支持1.3到1.6之间的任何版本-target; 它没有说明在源中使用泛型和其他"兼容"功能时会发生什么.编译器应该能够剥离它们.

游戏中的另一个罪魁祸首可能是javac:编译器可能能够处理这组参数,但命令行工具可能会冒犯.

在这种情况下,使用Java Compiler API编写自己的命令行.这可能会带来一些你无法实现的技巧.

您也可以尝试Eclipse编译器(请参阅" 使用批处理编译器 ").

由于Java的工作原理,这可能会失败:只要X <= Y,Java X代码就可以在Java Y上运行.因此,虽然您可以轻松地为Java 6 VM编译Java 1.4代码,但反之并非总是如此.

如果其他一切都失败了,那就编写一个预处理器来读取源代码并删除不支持的元素(比如@Override在接口上).只要您使用Java 6 编译带有注释的代码,转换后的代码也应该是安全的(除非您的代码剥离器有错误...)

  • 我用Java做了很多奇怪的事情,我没有听说过一个可以自动"降级"源代码的SDK.因此我的其他建议.也就是说,如果你想投入时间,Eclipse编译器可能是你最好的选择,因为它带有完整的源代码.你可以破解它做你想做的事 - 如果还不能. (3认同)