2009-09-24 93 views
3

我们的应用程序需要支持1.5和1.6的JVM。 1.5支持需要避开1.6 JRE依赖关系,而1.6支持需要利用1.6-only特性。多JRE版本支持的最佳开发实践是什么?

当我们将Eclipse项目更改为使用1.5 JRE时,我们将所有依赖项标记为错误。这对于查看依赖关系的位置很有用,但对简单开发没有用处。提交这样的编译错误的源也感觉不对。

这种多JRE版本支持的最佳做法是什么?

在C语言中,我们有#ifdef编译器指令来相当干净地解决这些问题。什么是最清洁的Java等价物?

+0

你如何设法建立你的1.5版本?你是否仔细排除了构建文件中的1.6依赖的东西? – auramo 2009-09-24 11:20:59

回答

3

如果您的软件必须同时在JRE 1.5和1.6上运行,那么您为什么不仅仅开发1.5版本?是否有理由为什么您绝对需要使用仅在Java 6中可用的功能?是否没有在Java 1.5上运行的第三方库包含您想要使用的仅支持1.6的功能的等效项?

保持两个代码库,使它们保持同步等是很多工作,并且可能不值得您获得的成果。因为Java没有预处理器,所以你不能像使用预处理器指令那样(很容易)在C中做这样的条件编译。

这取决于课程的规模,但我会说:不要这样做,只使用Java 5特性,如果您认为需要Java 6特定的东西,在Java 5上运行的第三方库可以实现这些功能(甚至可以自己编写它 - 从长远来看,这可能比尝试维护两个代码库的工作更少)。

+0

正是我要说的。仅针对1.5开发,不要使用任何弃用的API或功能。 – cletus 2009-09-24 12:08:58

+1

1.6中没有什么用处? – 2009-09-24 13:03:42

+1

汤姆,这是一个单独的问题,不是吗?如果他们的应用程序没有使用特定于1.6的任何东西,那么他们可以通过瞄准1.5来节省大量时间。 – 2009-09-24 13:34:57

1

有几个方法,你可以使用:

  • 编译为1.6,并使用测试,以确保功能缓慢下降;这是我在商业产品(1.3兼容性1.4目标)上合作的一个流程
  • 使用特定于版本的插件并使用运行时确定要加载的内容;这需要某种插件框架
  • 针对1.5编译并使用反射来调用1.6功能;我会避免因为过度的性能降低

在所有的情况下,第一种方法增加了复杂性这一点,你要隔离功能,确保生成的类文件有version of 49.0(用1.5目标编译) 。初始化外观类时,可以使用反射来确定方法/功能的可用性。

2

将大部分代码编译为1.5。为1.6特定的代码有一个单独的源代码目录。 1.6来源应该取决于1.5,但反之亦然。接口1.6代码应该通过从1.5代码中分类类型来完成。 1.5代码可能有替代实现,而不是每个地方都检查null

使用一次反射来尝试加载根1.6类的实例。在创建一个实例之前,根类应该检查它是否运行在1.6之上(我建议在静态初始化程序中使用-target 1.6`和仅使用1.6的方法)。

0

如果它很容易分支(git,svn或Perforce会很好),你可以使用你的源代码控制来帮助你一点。你可以有两个分支的代码,1.5分支和1.5分支的1.5分支。

有了这个,您可以在1.5分支上开发1.5版本,然后根据需要将您的更改/ bug修正合并到1.6分支中,然后针对特定的1.6需求进行任何代码升级。

当您需要释放代码时,您可以从需要的任何分支构建它。

对于你的Eclipse,你可以维护两个工作空间,一个用于每个分支,或者你可以只有两套项目,每个分支一套,但你需要有不同的项目名称,这可能会很痛苦。我会推荐工作区的方法(虽然它有它自己的痛苦)。

然后,您可以根据需要为每个项目/工作区指定所需的JVM版本。

希望这会有所帮助。

(补充:这也将使得在这样的时候,轻松过渡,当你不再需要1.5的支持,您只需关闭分支,开始只在1.6分支工作)

0

一种选择是将代码分解成3个项目。

一个项目将包含常见的东西,这些东西可以在任一版本的java上运行。

一个项目将包含java6实现,并将取决于通用项目。

一个项目将包含java5实现并取决于通用项目。

将事情分解为与实现这些接口的实现的接口,可以消除任何构建依赖关系。你几乎肯定需要这种或那种依赖注入来帮助你将具体的类连接起来。

在Eclipse中工作时,可以将java6项目设置为目标java6,将另外2个项目设置为目标java5。通过按项目选择项目基础上的JRE,您会看到您错过的任何依赖关系。

通过让您的构建文件变得有点聪明,您可以通过两种方式构建通用位,并依赖于正确的版本进行部署 - 尽管我不确定这会带来多少好处。

您最终会得到两个不同版本的应用程序 - 一个用于java6,一个用于java5。