我知道在C / C ++中没有条件编译这样的东西,但我想知道是否有可能根据需求有条件地生成java程序。例如,可能有一个包含一些功能的公共版本和包含更多功能的私有版本。
我是否正确地认为实现这一目标的唯一方法是借助插件之类的东西,即如果它们存在于类路径中,则会动态找到不同的功能?
答案 0 :(得分:3)
我会为您的应用程序和多个jar提供多个模块。我会将所有“私人”功能单独放在一个罐子里,其余的放在一个或多个罐子里。
您的应用程序将使用分发的jar中可用的功能(有多种方法可以执行此操作)
您可能会发现有用的库是Reflections此库允许您查找实现接口或具有注释的所有类。所以你可以有一个Feature
界面并要求它给你所有Feature
s
答案 1 :(得分:1)
将java包分离为使用接口和这些接口的实现并不罕见。
在打包时,您可以使用Ant或Maven根据条件过滤/实施实施。就像私有版本的不同且功能更丰富的实现一样。
检查类路径是可以的,但更好的办法是使用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
等。
然后,您可以构建仅包含基本功能,基本+高级功能或包含所有功能(包括高级功能)的高级版本的分发包。因为应用程序会自动检测可用的功能,所以您可以稍后将它们放在罐子里,这些罐子只需要放在类路径上,而不是其他的。
当然,这种设计需要进一步发展才能得到有效利用,但你明白了。