在多个JDK下开发的最佳实践

时间:2013-06-22 15:44:07

标签: java project development-environment

我有一个目前正在开发的库,它与JDK 6具有目标兼容性。我喜欢利用Java 8功能,比如lambdas。代码和API将从Java 8中获益匪浅。

我想为Java 6和Java 8提供库的版本,例如,某些部分仅在Java 8版本中可用。

现在有一些核心类可能有不同的源版本(旧的Java 6版本和新的Java 8版本)。

这样做的最佳做法是什么? 在Objective-C或C ++中,我会考虑使用预处理器指令。

2 个答案:

答案 0 :(得分:2)

我看到了几个选项:

  1. 打包库的不同版本,一个用于JDK6,另一个用于JDK8。用户有责任为他们的申请包括正确的。这将是一个有趣的构建。如果您正在使用Maven,我认为您只需使用3个项目;一个“commons”项目,包含所有公共类,一个“JDK6”项目,它将commons项目作为依赖项构建JDK6 jar,然后是一个“JDK8”项目,它将commons项目作为依赖项并构建JDK8 jar。这种方法的一个有吸引力的方面是它显然有效,而且你没有难以进行的维护。
  2. 将JDK6和JDK8版本打包在同一个JAR中,并创建一个“运行时”类,该类负责在运行时根据运行的JDK创建库对象的正确版本。例如:

    public abstract class Runtime {
        private static Runtime instance;
    
        public static Runtime getInstance() {
            if(instance == null) {
                try {
                    if(System.getProperty("java.version").startsWith("8"))
                        instance = Class.forName("com.yourcompany.libname.runtime.Runtime8").newInstance();
                    else
                        instance = Class.forName("com.yourcompany.libname.runtime.Runtime6").newInstance();
                }
                catch(Exception e) {
                    throw new RuntimeException("Could not create runtime", e);
                }
            }
            return instance;
        }
    
        public abstract Framework getFramework();
    }
    

    使用这种方法,您只需要使用反射来加载初始的“运行时”对象,然后就可以使用本机Java来完成其他任务。例如:

     Framework framework=Runtime.getInstance().getFramework();
     ModelObject1 m=framework.newModelObject1();
     // ...
    

    请确保您的Runtime6课程不参考JDK8课程,即​​使是通过导入进行传递也是如此。这种方法的主要缺点是随着时间的推移跟踪那个小小的花絮。

  3. 我认为你所做的事情很有趣,而且我很想知道你是如何选择完成它的。请留意我们!

答案 1 :(得分:0)

我认为您可以使用系统属性(http://docs.oracle.com/javase/tutorial/essential/environment/sysprop.html)来发现使用哪个Java版本,然后您可以调整应用程序以便相应地运行。