注:请不要 不 上交叉编译的所有危险评。谢谢。
我遇到一种情况,我们需要为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
是否有 任何 对Linux(Ubuntu的11.10,86),其中使用javac可以做到这一点的Java分配?
编辑:似乎没有,因为在javac中的限制是相同的。解决方案(使此需求消失了)是从默认的javac编译器更改为maven-compiler- plugin中的eclipse编译器。
编辑:我发现Eclipse编译器为javadoc实用程序不同意的匿名内部类生成字节代码。我正在准备此问题的错误报告。
根据文档(Java5,Java6),当您遵循“交叉编译示例”中的说明时,Oracle SDK应该能够执行此操作。
Java 6应该支持1.3到1.6之间的任何版本,例如-target;它没有说明在源中使用泛型和其他“兼容”功能时会发生什么。编译器 _应该_能够剥离它们。
-target
游戏中的另一个罪魁祸首可能是javac: 编译器 可能能够处理这组参数,但是 命令行工具 可能会冒犯。
javac
在这种情况下,请使用Java CompilerAPI编写自己的命令行。这可能会带来一些其他方法无法实现的技巧。
您也可以尝试使用Eclipse编译器(请参阅“使用批处理编译器 ”)。
这可能由于Java的工作方式而失败:只要X <= Y,Java X代码就可以在Java Y上运行。因此,尽管您可以轻松地为Java 6 VM编译Java1.4代码,但并非总是如此。
如果其他所有方法均失败,则编写一个预处理器,该预处理器读取源并剥离不支持的元素(例如@Override接口上的)。只要使用Java 6偶尔编译 _带有_批注的代码,转换后的代码也应该是安全的(除非您的代码剥离程序有错误…)
@Override