我维护一个Java Swing应用程序。
为了向后兼容java 5(对于Apple机器),我们维护了两个代码库,一个使用Java 6的特性,另一个不使用这些特性。
代码基本相同,除了3-4个使用Java6特性的类。
我希望只维护一个代码库。在编译过程中,有没有办法让Java5编译器“忽略”我代码的某些部分?
我不希望简单地注释/取消注释部分代码,这取决于java编译器的版本。
发布于 2008-09-16 17:00:44
假设这些类具有相似的功能,但在实现上存在1.5和6.0的差异,您可以将它们合并到一个类中。然后,无需编辑源代码进行注释/取消注释,您就可以依赖编译器始终执行的优化。如果If表达式始终为false,则if语句中的代码将不会包含在编译中。
您可以在某个类中创建一个静态变量,以确定要运行的版本:
public static final boolean COMPILED_IN_JAVA_6 = false;
然后让受影响的类检查该静态变量,并将代码的不同部分放入一个简单的if语句中
if (VersionUtil.COMPILED_IN_JAVA_6) {
// Java 6 stuff goes here
} else {
// Java 1.5 stuff goes here
}
然后,当你想编译另一个版本时,你只需要改变一个变量,然后重新编译。它可能会使java文件变得更大,但它会合并您的代码,并消除您的任何代码重复。您的编辑器可能会抱怨无法访问的代码或其他任何东西,但编译器应该愉快地忽略它。
发布于 2008-09-16 19:58:13
关于使用自定义类加载器和动态注释代码的建议,当涉及到维护和维护任何可怜的人在您重新开始新的工作之后重新开始项目时,都会有点令人难以置信。
解决方案很简单。将受影响的类拉出到两个独立的项目中-确保包名相同,然后编译成jars,然后可以在主项目中消费。如果包名保持不变,方法签名保持不变,那么没问题--只需将所需的jar版本放入部署脚本中即可。我假设您运行不同的构建脚本,或者在同一脚本中有不同的目标- ant和maven都可以轻松地处理有条件的抓取和复制文件。
发布于 2008-09-16 16:23:32
我认为这里最好的方法可能是使用构建脚本。您可以将所有代码放在一个位置,通过选择要包括和不包括的文件,可以选择要编译的代码版本。请注意,如果您需要比每个文件更细粒度的控制,这可能没有帮助。
https://stackoverflow.com/questions/74171
复制相似问题