我的第一个想法是尽可能保留单个代码库并使用某种标志进行切换。
如果不可能,我会尽量保持相同,让较大的项目使用较小的项目作为子项目,如果可能的话自动启用某些功能——例如,每个项目都可以有它自己的主,不同的构建可能只是调用设置标志以启用功能的不同主。
如果您的标志是最终的,它甚至应该避免将不必要的代码拉入您的项目。
最后,最坏的情况,Subversion 中的 3 个分支。
编辑:
您让我对此进行了更多思考,我认为我找到了更好的解决方案。
我想我会把它分成四个项目,将所有“常见”的东西合并到一个基础项目中,而不同的东西,我会分散到其他三个项目中——假设你有基础、演示、支付和商业项目..
这三者可能不同,您将有一个来自演示/支付/业务类之一的对象提供该功能。例如,如果付费版本有新的菜单项,则您的一个对象中可能有一个 getMenuItems。它将返回一个菜单树,您可以将其放置在菜单栏中。演示版的项目会更少。
这样你的“基础”永远不知道它运行的是哪个版本,它只使用对象。
为了获得这些物品,我需要一个工厂。工厂看起来像这样:
private String[] availablePackages={"business", "pay", "demo"};
public getMenuClass() {
Class c;
for(String package : availablePackages) {
try {
c=Class.forName("com.meh.myapp."+package+".MenuClass");
} catch... {
// No package by that name
}
if(c != null) {
return c.newInstance();
}
}
// Something went wrong, no instance found.
上升趋势是您应该先尝试实例化 com.meh.myapp.business.MenuClass,然后尝试 ...pay.MenuClass 最后 ...demo.MenuClass。
这应该允许您通过简单地发送不同的 jar 来更改您的配置——如果您决定只发送演示和主 jar,您将获得一个演示应用程序。通过运送支付罐,您将获得支付应用程序。
请注意,您很可能希望业务将大部分工作委托给“支付”,而“支付”将大量工作委托给“演示”,但演示对业务或支付一无所知,而“main”只知道其他三个反射性。
这将是一个很好的解决方案,因为不需要配置 - 事实上,您只需运送付费 jar 即可从演示升级到付费,主 jar 和演示 jar 可重复使用并保持在原处.