问题 是否有一个Java程序片段可以使用JRE 6上的Java 5编译器进行编译,但不能编译Java 6编译器?


我希望有一个源文件,可以将javac / ecj设置为Java 5而不是Java 6(即使底层Java运行时是Java 6)也可以编译。

这是确定在安装了Java 6的Eclipse 3.5中正确设置了编译器级别,但结果需要在Java 5安装上运行。

对于java 1.4,我可以使用“enum”作为变量名称(在Java 5及更高版本中失败)但是我找不到类似于Java 5与6(及更高版本)的方法。

建议?


6199
2017-11-19 12:44


起源

为什么不在eclipse上更改编译器级别? - Diego Dias
@Diago,问题是“这是确定编译器级别设置正确”。 - Thorbjørn Ravn Andersen
在JDK5和6之间没有删除任何语言。如上所述,唯一添加的是接口方法的覆盖注释 - 因此不是关键字。因此,我担心你会遇到库差异 - oxbow_lakes
注意:使用maven时,现代IDE可以根据pom.xml中的元数据选择最合适的Java发行版,从而减少问题。 - Thorbjørn Ravn Andersen


答案:


什么都没有 Java语言 那是 去除 在JDK5和6之间。如前所述,唯一添加的是 @Override 接口方法允许注释 - 没有关键字。因此,我担心库存差异是导致改变的唯一原因。

即使在核心API中也存在这些;在一个不寻常的向后兼容性破坏狂欢中,他们改变了一些方法的签名 ExecutorService 接口。这是因为这些方法的通用签名过于严格。这是一个 纯图书馆改变 (虽然,作为一部分 java.util, 一个漂亮 核心库);与任何语言级别的修改无关。

例如, 来自JDK5

<T> T invokeAny(Collection<Callable<T>> tasks)

到JDK6

<T> T invokeAny(Collection<? extends Callable<T>> tasks)

这意味着任何包含代码的程序 实施 JDK5中的这个接口,不会针对JDK6进行编译。一个片段很容易创建;让你的IDE创建一个JDK5接口的空实现,然后针对JDK6构建。

注意: 添加了通配符,因为以前的版本不会接受像这样的参数 List<MyCallable<String>> (即,由可调用的某些子类键入集合),而后一版本可以。


14
2017-11-19 13:26



+1好心思 - skaffman
接得好。 +1(如图所示 old.nabble.com/...) - VonC
我可以证明被这种方式所困扰 - 现在我们必须支持我们的一些代码的两个版本,纯粹是因为这个库的变化 - oxbow_lakes


以来 JVMDI 已被删除,JVMPI在Java SE 6中被禁用(根据 J2SE 6.0发行说明),您可以使用该API添加代码:它不会使用J2SE 6.0编译,只能使用5.0。 (如图所示 这个帖子


2
2017-11-19 13:22



如果我理解正确,这是JRE的差异,而不是语言的变化?那么它将取决于所使用的JRE,而不是编译器级别?我不想在开发时使用Java 5,只是发现编译器级别不正确。 - Thorbjørn Ravn Andersen
@Thorbjørn:是的,我找不到任何可编译的实际代码,只能在运行时加载动态库。那么,就目前而言,它不是一个合适的解决方案(我将它保存在CW模式下进行存档) - VonC


不是您的问题的答案,而是您的方法的替代方案:是否可以使用您根据需要创建最终应用程序或库的基于ant或maven的第二个构建器?此构建将使用真正的外部Java 5 SDK,从而保证应用程序/库在Java5环境中运行。


0



是。我们有一个构建系统,可以在正确的级别上构建工件等。但是,在开发过程中我经常需要在我的PC上使用Eclipse构建并在开发机器上运行(只有Java 5,而不是PC) )。因此,需要确定使用Java 5.我们经常创建新的工作区,因为Eclipse中的工作集工具是一个笑话。 - Thorbjørn Ravn Andersen
完全同意工作集功能。我正在做的一个工作空间/项目;) - Andreas_D