Java编译 - 有没有办法告诉编译器忽略我的部分代码?

Mer*_*erv 10 java swing compilation

我维护一个Java Swing应用程序.

为了向后兼容java 5(对于Apple机器),我们维护了两个代码库,一个使用Java 6中的功能,另一个没有这些功能.

除了使用Java 6功能的3-4个类之外,代码大致相同.

我希望只保留1个代码库.在编译期间有没有办法让Java 5编译器"忽略"我代码的某些部分?

我不希望简单地评论/取消注释我的代码部分,具体取决于我的java编译器的版本.

Ian*_*Ian 5

关于使用自定义类加载器和动态注释代码的建议有点不可思议,当涉及到维护和保持灵性时,无论哪个可怜的灵魂在你洗牌到新的牧场后接受项目.

解决方案很简单.将受影响的类拉出到两个独立的独立项目中 - 确保包名称相同,然后编译成可以在主项目中使用的jar.如果保持包名称相同,并且方法签名相同,则没有问题 - 只需将您需要的jar版本放入部署脚本中即可.我假设您在同一个脚本中运行单独的构建脚本或具有单独的目标 - ant和maven都可以轻松处理有条件地抓取文件并复制它们.


18R*_*bit 4

假设这些类具有相似的功能,但实现上有 1.5 与 6.0 的差异,您可以将它们合并到一个类中。然后,无需编辑源代码以进行注释/取消注释,您就可以依赖编译器始终执行的优化。如果 if 表达式始终为 false,则 if 语句中的代码将不会包含在编译中。

您可以在其中一个类中创建一个静态变量来确定要运行的版本:

public static final boolean COMPILED_IN_JAVA_6 = false;
Run Code Online (Sandbox Code Playgroud)

然后让受影响的类检查该静态变量并将不同的代码部分放在一个简单的 if 语句中

if (VersionUtil.COMPILED_IN_JAVA_6) {
  // Java 6 stuff goes here
} else {
  // Java 1.5 stuff goes here
}
Run Code Online (Sandbox Code Playgroud)

然后,当您想编译另一版本时,您只需更改该变量并重新编译即可。它可能会使 java 文件更大,但它会合并您的代码并消除您拥有的任何代码重复。您的编辑器可能会抱怨无法访问的代码或其他什么,但编译器应该幸福地忽略它。

  • 这个答案似乎不正确。我做了一个使用 java.io.Console 和上述方法的快速 Java 应用程序。编译器在 1.5 中失败,错误如下: Test.java:8: 找不到符号:方法 console() 位置:类 java.lang.System (3认同)
  • 这个答案*是*不正确的。Java 5 编译器将无法编译“Java 6 stuff gone here”块,因此您还没有解决问题。更好的解决方案是拥有两种接口实现,一种用于 Java 5,一种用于 Java 6。然后,您的构建工具可以在编译时包含正确的实现。Ant 可以通过使用构建属性轻松地做到这一点。 (2认同)