一尘不染

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

linux

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


我遇到一种情况,我们需要为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实用程序不同意的匿名内部类生成字节代码。我正在准备此问题的错误报告。


阅读 389

收藏
2020-06-03

共1个答案

一尘不染

根据文档(Java5Java6),当您遵循“交叉编译示例”中的说明时,Oracle SDK应该能够执行此操作。

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

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

在这种情况下,请使用Java CompilerAPI编写自己的命令行。这可能会带来一些其他方法无法实现的技巧。

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

这可能由于Java的工作方式而失败:只要X <= Y,Java X代码就可以在Java Y上运行。因此,尽管您可以轻松地为Java 6 VM编译Java1.4代码,但并非总是如此。

如果其他所有方法均失败,则编写一个预处理器,该预处理器读取源并剥离不支持的元素(例如@Override接口上的)。只要使用Java 6偶尔编译 _带有_批注的代码,转换后的代码也应该是安全的(除非您的代码剥离程序有错误…)

2020-06-03