我们的应用程序需要支持1.5和1.6 JVM。1.5支持需要避免任何1.6 JRE依赖,而1.6支持需要利用仅1.6的特性。
当我们将Eclipse项目更改为使用1.5 JRE时,我们会得到标记为错误的所有依赖项。这对于查看我们的依赖项在哪里很有用,但对于普通的开发没有什么用处。使用这样的编译错误提交源代码感觉也是错误的。
这种多JRE版本支持的最佳实践是什么?
在C语言中,我们有#ifdef编译器指令来相当干净地解决这类问题。最干净的Java等价物是什么?
发布于 2009-09-24 11:20:32
如果你的软件必须同时在JRE 1.5和1.6上运行,那么为什么你不只为1.5开发呢?为什么一定要使用Java 6中才有的特性,这有什么原因吗?是否没有运行在Java1.5上的第三方库包含您想要使用的1.6版特性的等价物?
维护两个代码库,使它们保持同步等是一项大量的工作,与您所获得的相比,可能不值得付出这些努力。
当然,Java没有预处理器,所以您不能(轻松地)像在C中使用预处理器指令那样进行条件编译。
当然,这取决于您的项目有多大,但我想说的是:不要这样做,只使用Java 5特性,如果您认为需要Java 6特定的功能,那么请寻找在Java 5上运行的第三方库来实现这些功能(或者甚至自己编写-从长远来看,这可能比试图维护两个代码库的工作量要少)。
发布于 2009-09-24 13:02:59
将大部分代码编译为1.5。有一个单独的源代码目录来存放1.6特定的代码。1.6版本的源代码应该依赖于1.5版本,但反之亦然。与1.6代码的接口应该通过子键入1.5代码中的类型来完成。1.5版本的代码可能有一个替代的实现,而不是到处检查null。
使用单个反射一次来尝试加载根1.6类的实例。在允许创建实例之前,根类应该检查它是否在1.6上运行(我建议在静态初始化器中使用-target1.6`和只有1.6的方法)。
发布于 2009-09-24 11:34:44
有几种方法可以使用:
针对1.6进行编译,并使用测试来确保功能正常降级;这是我在商业产品上使用过的过程(1.4针对1.3 compatibility)
在所有情况下,您都需要隔离功能,并确保生成的类文件具有version of 49.0 (使用1.5目标进行编译)。在初始化外观类时,您可以使用反射来确定方法/功能的可用性。
https://stackoverflow.com/questions/1470996
复制相似问题