2009-11-19 95 views
11

我想要一个可以使用javac/ecj设置为Java 5而不是Java 6(即使底层Java运行时为Java 6)的源文件。是否有Java程序片段可以在JRE 6上使用Java 5编译器进行编译,但是不能使用Java 6编译器进行编译?

这是可以肯定,编译器级别正确设置在Eclipse 3.5和Java 6安装运行,但如果结果需要在Java 5的安装运行。

对于Java 1.4,我可以使用“枚举”作为变量名(其中的Java 5及更高版本下失败),但我无法找到一个类似的方法对Java 5比6(及更高版本)。

对此提出建议?

+0

为什么不在eclipse上改变编译器级别? – 2009-11-19 12:53:29

+0

@Diago,从问题“这是为了确定编译器级别设置正确”。 – 2009-11-19 12:58:05

+0

在JDK5和6之间语言中没有任何东西被删除。如前所述,添加的唯一东西是接口方法上的重写注释 - 因此不是关键字。因此,你被困在图书馆的差异,恐怕 – 2009-11-19 13:41:06

回答

14

没有什么在Java语言这是删除 JDK5和6向其中加入的唯一的事情之间,正如人们所说的,是@Override注释是接口方法上允许的 - 没有关键字。因此,我担心,你只剩下图书馆差异是导致变革的唯一原因。

这些确实存在,即使在核心API中;在向后兼容的突破性狂欢中,他们改变了ExecutorService界面上某些方法的签名。这是因为这些方法的通用签名过于严格。这是一个纯库变化(虽然,为的java.util,一个相当核心库部分);与任何语言级别的修改无关。

例如,from JDK5

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

to JDK6

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

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

注意:添加通配符,因为以前的版本不会接受像List<MyCallable<String>>参数(即收集由可调用的某个子类类型),而后来的版本则

+0

+1思路不错 – skaffman 2009-11-19 13:33:50

+1

好抓。 +1(这里说明http://old.nabble.com/Incompatible-API-change-between-Java-5-and-Java-6--td22983799.html) – VonC 2009-11-19 13:34:59

+0

我可以证明被此事咬伤 - 现在我们必须支持我们一些代码的两个版本,纯粹是因为这个库变化 – 2009-11-19 13:36:06

2

由于JVMDI已被删除,Java SE 6中的JVMPI被禁用(根据J2SE 6.0 release note),您可以使用该API添加代码:它不会使用J2SE 6.0进行编译,仅编译为5.0。 (如this thread所示)

+0

如果我正确地理解你,这是一个JRE的差异,而不是语言的变化?那么它将取决于所使用的JRE,而不是编译器级别?我不想在开发时使用Java 5,只是发现编译器级别不正确。 – 2009-11-19 13:00:53

+0

@Thorbjørn:是的,我找不到任何可以编译的实际代码,只有在运行时加载的动态库。所以,现在,这不是一个合适的解决方案(我保留在CW模式下进行存档) – VonC 2009-11-19 13:32:04

0

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

+0

是的。我们有一个构建系统,它可以在正确的级别上构建工件等,但是这需要时间,但是在开发过程中,我经常需要在我的PC上使用Eclipse进行构建,然后在开发机器上运行(只有Java 5,而不是PC )。因此,需要确定使用Java 5.我们经常创建新的工作区,因为Eclipse中的工作集工具是一个笑话。 – 2009-11-19 15:41:47

+1

完全同意工作集功能。一个工作区/项目也是我在做的;) – 2009-11-19 15:52:43