4

我正在开发一个大型遗留代码库,目前只能使用 java 1.4 编译。我需要做的一件事是让它与 1.6(现在可能是 1.7)一起工作。

头部构建当前不使用 1.6 编译。这有很多原因 - 大多数都很容易修复,比如enum用作关键字,但我们正在努力与 Oracle/Sun 更新 JDBC(连接接口)以支持 java 1.4 中不可用的类型。这意味着,如果我对 1.6 进行更改,主要生产构建会中断为像NClobbreak 这样的类,因为它们不在 1.4 版本中;如果我不进行更改,我将无法使用 1.6 编译器进行编译。

是否有任何模式支持 Java 中的条件编译/构建?到目前为止,我提出的唯一计划是摆弄 ant 构建,以根据构建有条件地换入/换出类。这感觉非常可怕,因此向这里的社区询问想法。

同样,问题的边界是:

  • 需要能够HEAD在 1.4 上继续编译(恐怕没有 1.6 与 1.4 兼容模式)
  • 还需要一个单独的使用 1.6 编译的头部构建 - 假设这将需要一些时间(因为它是一个大型代码库),因此在我们准备头部构建时允许其他人继续工作并提供其他更改的第一个要点1.6 兼容性。
  • 这是一棵巨大的代码树;这意味着我们的代码都不是库依赖,而且我们不能轻易做到这一点(记住:遗留代码库:(
  • 我们不允许分支(原因是我不会进入,除非我真的必须这样做)

提前谢谢了。

4

4 回答 4

4

这就是 makefiles/pom.xml/build.xml 被签入的原因。使用您的修订控制系统创建一个分支。在一个分支中,进行 1.6 兼容性所需的所有更改。在其他分支,不要。任何给定的分支都将安全地编译为 1.4 或安全地编译为 1.6,没有 frankenbranch 尝试同时执行这两种操作,这是一个坏主意(tm)。

于 2013-01-14T21:44:30.337 回答
3

使用相同的类和相同的方法创建一个 and ,但实现不同port14.jarport16.jar并进行两个单独的构建。

这意味着双重工作,但您可以同时使用相同的代码基础。并且差异是相对的“次要”。

于 2013-01-14T21:49:05.680 回答
3

我使用 Maven,我将拥有定义两个版本共享的接口的模块。然后你有两个模块,一个带有 1.4 代码,一个带有 Java 6(或 7 或 8)版本。这样,您可以同时构建它们并在运行时选择适当的实现。

于 2013-01-14T21:49:38.007 回答
3

有一个先前的 SO answer涵盖了这一点,本质上是使用 ant 的replace任务来制作 IFDEF 块的快速而肮脏的版本。这可能比换掉整个类文件更容易,并且可以更容易地完成 1.6(只需删除所有 1.4 IFDEF 块)

于 2013-01-14T21:51:03.490 回答