我们的应用程序需要支持1.5和1.6 JVM。 1.5支持需要保持清除任何1.6 JRE依赖性,而1.6支持需要利用仅1.6的功能。
当我们将Eclipse项目更改为使用1.5 JRE时,我们会将所有依赖项标记为错误。这对于查看依赖项的位置很有用,但对于简单开发没有用。使用此类编译错误提交源代码也感觉不对。
此类多JRE版本支持的最佳做法是什么?
在C land中,我们使用#ifdef编译器指令来相当干净地解决这些问题。什么是最干净的Java等价物?
答案 0 :(得分:3)
如果您的软件必须同时运行JRE 1.5和1.6,那么为什么不仅仅为1.5开发?您是否有必要使用仅在Java 6中提供的功能?是否没有在Java 1.5上运行的第三方库包含您要使用的仅1.6功能的等效项?
保持两个代码库,使它们保持同步等是很多工作,与你获得的相比,可能不值得付出努力。
Java ofcourse没有预处理程序,所以你不能(轻松)进行条件编译,就像你可以在C中使用预处理程序指令一样。这取决于您的项目有多大,但我会说:不要这样做,只使用Java 5功能,如果您认为需要Java 6特定的东西,那么寻找第三方在Java 5上运行的库实现了这些东西(甚至自己编写 - 从长远来看,这可能比尝试维护两个代码库的工作要少。)
答案 1 :(得分:2)
将大部分代码编译为1.5。为1.6特定代码提供单独的源目录。 1.6源应该取决于1.5,但反之亦然。应该通过1.5代码中的子类型来完成与1.6代码的连接。 1.5代码可能有替代实现,而不是在任何地方检查null
。
使用单个反射一次尝试加载根1.6类的实例。在允许创建实例之前,根类应检查它是否在1.6上运行(我建议使用-target
1.6`并在静态初始化器中使用1.6 only方法。)
答案 2 :(得分:1)
您可以使用几种方法:
在所有情况下,您都希望隔离功能并确保生成的类文件具有version of 49.0(使用1.5目标进行编译)。初始化façade类时,可以使用反射来确定方法/功能的可用性。
答案 3 :(得分:0)
如果它很容易分支,你可以使用你的源代码控制来帮助你(git,svn或Perforce可以很好地工作)。你可以有两个代码分支,1.5分支,然后是1.6分支,从1.5分支分支出来。
有了这个,您可以在1.5分支上开发1.5,然后根据需要将您的更改/错误修正合并到1.6分支中,然后针对特定的1.6需求进行任何代码升级。
当您需要发布代码时,您可以从需要的任何分支构建代码。
对于Eclipse,您可以维护两个工作区,每个分支一个,或者您可以只有两组项目,每个分支一个,但您需要具有不同的项目名称,这可能很痛苦。我会推荐工作区方法(虽然它有自己的痛苦)。
然后,您可以根据需要为每个项目/工作区指定所需的JVM版本。
希望这有帮助。
(补充:当您不再需要1.5支持时,这也可以轻松转换,您只需关闭该分支并开始仅在1.6分支中工作)
答案 4 :(得分:0)
一种选择是将代码分解为3个项目。
一个项目将包含适用于任一版本的java的常见内容。
一个项目将包含java6实现,并取决于常见项目。
一个项目将包含java5实现,并取决于常见项目。
将事物分解为与实现这些接口的实现的接口,您可以消除任何构建依赖性。您几乎肯定需要依赖注入这种或那种来帮助将您的具体类连接起来。
在Eclipse中工作,您可以将java6项目设置为目标java6,将其他2个项目设置为目标java5。通过逐个项目选择JRE,您将显示您错过的任何依赖项。
通过对构建文件稍微巧妙一点,您可以通过两种方式构建公共位,并依赖于正确的版本进行部署 - 尽管我不确定这会带来多大好处。
您最终会得到两个独立的应用程序版本 - 一个用于java6,一个用于java5。