我们的应用程序需要支持1.5和1.6的JVM。 1.5支持需要避开1.6 JRE依赖关系,而1.6支持需要利用1.6-only特性。多JRE版本支持的最佳开发实践是什么?
当我们将Eclipse项目更改为使用1.5 JRE时,我们将所有依赖项标记为错误。这对于查看依赖关系的位置很有用,但对简单开发没有用处。提交这样的编译错误的源也感觉不对。
这种多JRE版本支持的最佳做法是什么?
在C语言中,我们有#ifdef编译器指令来相当干净地解决这些问题。什么是最清洁的Java等价物?
我们的应用程序需要支持1.5和1.6的JVM。 1.5支持需要避开1.6 JRE依赖关系,而1.6支持需要利用1.6-only特性。多JRE版本支持的最佳开发实践是什么?
当我们将Eclipse项目更改为使用1.5 JRE时,我们将所有依赖项标记为错误。这对于查看依赖关系的位置很有用,但对简单开发没有用处。提交这样的编译错误的源也感觉不对。
这种多JRE版本支持的最佳做法是什么?
在C语言中,我们有#ifdef编译器指令来相当干净地解决这些问题。什么是最清洁的Java等价物?
如果您的软件必须同时在JRE 1.5和1.6上运行,那么您为什么不仅仅开发1.5版本?是否有理由为什么您绝对需要使用仅在Java 6中可用的功能?是否没有在Java 1.5上运行的第三方库包含您想要使用的仅支持1.6的功能的等效项?
保持两个代码库,使它们保持同步等是很多工作,并且可能不值得您获得的成果。因为Java没有预处理器,所以你不能像使用预处理器指令那样(很容易)在C中做这样的条件编译。
这取决于课程的规模,但我会说:不要这样做,只使用Java 5特性,如果您认为需要Java 6特定的东西,在Java 5上运行的第三方库可以实现这些功能(甚至可以自己编写它 - 从长远来看,这可能比尝试维护两个代码库的工作更少)。
正是我要说的。仅针对1.5开发,不要使用任何弃用的API或功能。 – cletus 2009-09-24 12:08:58
1.6中没有什么用处? – 2009-09-24 13:03:42
汤姆,这是一个单独的问题,不是吗?如果他们的应用程序没有使用特定于1.6的任何东西,那么他们可以通过瞄准1.5来节省大量时间。 – 2009-09-24 13:34:57
有几个方法,你可以使用:
在所有的情况下,第一种方法增加了复杂性这一点,你要隔离功能,确保生成的类文件有version of 49.0(用1.5目标编译) 。初始化外观类时,可以使用反射来确定方法/功能的可用性。
将大部分代码编译为1.5。为1.6特定的代码有一个单独的源代码目录。 1.6来源应该取决于1.5,但反之亦然。接口1.6代码应该通过从1.5代码中分类类型来完成。 1.5代码可能有替代实现,而不是每个地方都检查null
。
使用一次反射来尝试加载根1.6类的实例。在创建一个实例之前,根类应该检查它是否运行在1.6之上(我建议在静态初始化程序中使用-target
1.6`和仅使用1.6的方法)。
如果它很容易分支(git,svn或Perforce会很好),你可以使用你的源代码控制来帮助你一点。你可以有两个分支的代码,1.5分支和1.5分支的1.5分支。
有了这个,您可以在1.5分支上开发1.5版本,然后根据需要将您的更改/ bug修正合并到1.6分支中,然后针对特定的1.6需求进行任何代码升级。
当您需要释放代码时,您可以从需要的任何分支构建它。
对于你的Eclipse,你可以维护两个工作空间,一个用于每个分支,或者你可以只有两套项目,每个分支一套,但你需要有不同的项目名称,这可能会很痛苦。我会推荐工作区的方法(虽然它有它自己的痛苦)。
然后,您可以根据需要为每个项目/工作区指定所需的JVM版本。
希望这会有所帮助。
(补充:这也将使得在这样的时候,轻松过渡,当你不再需要1.5的支持,您只需关闭分支,开始只在1.6分支工作)
一种选择是将代码分解成3个项目。
一个项目将包含常见的东西,这些东西可以在任一版本的java上运行。
一个项目将包含java6实现,并将取决于通用项目。
一个项目将包含java5实现并取决于通用项目。
将事情分解为与实现这些接口的实现的接口,可以消除任何构建依赖关系。你几乎肯定需要这种或那种依赖注入来帮助你将具体的类连接起来。
在Eclipse中工作时,可以将java6项目设置为目标java6,将另外2个项目设置为目标java5。通过按项目选择项目基础上的JRE,您会看到您错过的任何依赖关系。
通过让您的构建文件变得有点聪明,您可以通过两种方式构建通用位,并依赖于正确的版本进行部署 - 尽管我不确定这会带来多少好处。
您最终会得到两个不同版本的应用程序 - 一个用于java6,一个用于java5。
你如何设法建立你的1.5版本?你是否仔细排除了构建文件中的1.6依赖的东西? – auramo 2009-09-24 11:20:59