我可以交叉编译可选地使用Java 8中的类但编译为Java 6的Java代码吗?

时间:2016-11-29 12:15:25

标签: java maven gradle

我知道交叉编译的Java代码不能使用新的语言功能,IE没有像Java 8中的lambdas或Java 7中的try-with-resources这样的功能。
但是可以引用在新Java版本中添加的新类吗?

假设我有一个支持Java 6+的库,我有一些接受日期作为参数的方法 对于Java 6,我使用java.util.Date提供API,但对于Java 8的用户,我想提供使用java.time.Instant的选项。

我希望Java 6用户能够使用该库,但如果他们尝试使用ClassNotFoundException方法,则会遇到Instant

是否有一种可接受的方式来做这样的事情,如何使用像Gradle或Maven这样的常用构建工具来实现?

给出的例子是人为的,请不要给出处理时间的替代方法的答案。

3 个答案:

答案 0 :(得分:6)

干净利落是不可能的。提及Java 8类型的API无法在Java 6 JRE上加载。

如果您的API使用Java 8类,则Java 6客户端无法针对它进行编译。从理论上讲,您可以用(例如)java.lang.Object替换Java 8类,并要求客户端代码转换为java.util.Datejava.time.Instant,具体取决于执行平台。但我不明白这是多么可以接受,更不用说试图使用你的库的程序员了。

无论如何,你还需要更改你的API。

如果您确实需要支持Java 6,并且您还想在API中开始使用Java 8功能,我建议支持两个单独的API:

  • 一个仅用于Java 6的Java 6和
  • 另一个也使用Java 8类型。

可能能够共享API的两个版本背后的一些代码,但这取决于Java 8依赖关系的“深度”。

然而,更好的想法是咬紧牙关并停止支持Java 6兼容性。 Java 6在2013年2月达到了生命周期。 IMO,您有理由冻结Java 6 API,然后将Java 8 API视为需要客户端的新版本切换到Java 8。

答案 1 :(得分:1)

我认为如果使用目标版本Java 6从Java 8编译javac(或Gradle或Maven),但没有从Java 6设置类路径,它应该可以工作。但是您可能需要在类级别上进行拆分,而不是在方法级别进行拆分。

答案 2 :(得分:1)

向后移植

正如其他答案解释的那样,基本上答案是“不”。解决方法是使用back-ports功能的代码到早期版本的Java。

具体关于java.time类:

  • ThreeTen-Backport
    许多java.time功能都被反向移植到Java 6& ThreeTen-Backport项目中的7。
  • ThreeTenABP
    上述后端端口进一步适用于ThreeTenABP项目中的Android。