条件Java包分发

时间:2011-06-01 11:37:43

标签: java

我知道在C / C ++中没有条件编译这样的东西,但我想知道是否有可能根据需求有条件地生成java程序。例如,可能有一个包含一些功能的公共版本和包含更多功能的私有版本。

我是否正确地认为实现这一目标的唯一方法是借助插件之类的东西,即如果它们存在于类路径中,则会动态找到不同的功能?

3 个答案:

答案 0 :(得分:3)

我会为您的应用程序和多个jar提供多个模块。我会将所有“私人”功能单独放在一个罐子里,其余的放在一个或多个罐子里。

您的应用程序将使用分发的jar中可用的功能(有多种方法可以执行此操作)

您可能会发现有用的库是Reflections此库允许您查找实现接口或具有注释的所有类。所以你可以有一个Feature界面并要求它给你所有Feature s

的课程

答案 1 :(得分:1)

将java包分离为使用接口和这些接口的实现并不罕见。

在打包时,您可以使用AntMaven根据条件过滤/实施实施。就像私有版本的不同且功能更丰富的实现一样。

检查类路径是可以的,但更好的办法是使用JNDI并让应用程序的不同部分通过将它们自己注册到共享的JDNI上下文中来找到彼此。

答案 2 :(得分:0)

您可以轻松地以OOPS方式实现这一目标。 按照以下

组织features
Interface Feature
    Class BaseFeature
        Class BasicFeature1
        Class BasicFeature2
        Class SpecialFeature1
        Class SpecialFeature2
        Class PremiumFeature1
...

然后通过某种FeaturesManager

集中加载这些功能
class FeatureManager {
    String[] globalFeatureClasses = new String[]{--list all of them here, or load an external list etc--};
    for each feature in globalFeaturesList {
        if (class.forName(feature) != null) { // class is available
            // this feature available
        } else {
            // this feature is not available
        }
    }
}

features将实现其他接口以提供behaviour等。

然后,您可以构建仅包含基本功能,基本+高级功能或包含所有功能(包括高级功能)的高级版本的分发包。因为应用程序会自动检测可用的功能,所以您可以稍后将它们放在罐子里,这些罐子只需要放在类路径上,而不是其他的。

当然,这种设计需要进一步发展才能得到有效利用,但你明白了。