Java - 保持多版本应用程序不分裂代码库

时间:2009-05-20 08:03:55

标签: java preprocessor multiple-versions

我正在编写一个将以多个不同版本发布的应用程序(最初将存在大约10个代码库的变体,并且需要进行维护)。当然,98%左右的代码在不同的系统中是相同的,保持代码库完整是有意义的。

我的问题是 - 这样做的首选方法是什么?例如,如果我有一个类(MyClass)在某些版本(MyClassDifferent)中有所不同,并且该类在几个地方被引用。我想根据我正在编译的应用程序的版本来改变该引用,而不是必须拆分所有引用MyClassDifferent的类。预处理器宏会很好,但它们会使代码膨胀,而且只有概念实现可用吗?

我正在考虑像工厂模式这样的东西,再加上每个应用程序的配置文件。有没有人有任何提示或指示?

4 个答案:

答案 0 :(得分:4)

你走在正确的轨道上:工厂模式,配置等。

您还可以将系统特定功能放在单独的jar文件中,然后您只需要在核心jar文件旁边包含相应的jar。

答案 1 :(得分:2)

我的工厂方法第二,你应该仔细看看maven或ant(取决于你使用的是什么)。 您可以根据参数/配置文件部署不同的配置文件,以确定使用哪些类。

像C / C ++这样的预处理器makros不能直接用于java。虽然也许可以通过构建脚本来模拟这个。但我不会走那条路。我的建议是坚持工厂方法。

答案 2 :(得分:2)

幸运的是,你有几个选择

1)ServiceLoader(内置于java6中)将您的API类如MyClass放入jar中,针对此API编译您的应用程序。然后在/META-INF/services/com.foo.MyClass的单​​独jar中单独实现MyClass。 。然后你可以维护几个版本的应用程序,只需保持罐子的“分布”。你的“主”类只是一堆ServiceLoader调用

2)相同的体系结构1)但用Spring或Guice配置替换META-INF服务

3)OSGI

4)你的解决方案

答案 3 :(得分:1)

查找AbstractFactory设计模式,“依赖注入”和“控制反转”。 Martin Fowler撰写了关于这些here的文章。

简而言之,您提供了包含所有必需组件的JAR文件。对于可以自定义的每个服务点,您可以为服务定义接口。然后编写该接口的一个或多个实现。要创建服务对象,请向AbstractFactory询问它,例如:

AbstractFactory factory = new AbstractFactory();
...
ServiceXYZ s = factory.newServiceXYZ();
s.doThis();
s.doThat();

在AbstractFactory中,使用Java反射方法Class.classForName()和SomeClassObject.newInstance()构造适当的ServiceXYZ对象。 (这样做意味着你不必在jar文件中包含ServiceXYZ类,除非它有意义。你也可以正常构建对象。)

从每个站点唯一的属性文件中读取实际的类名称。

您可以轻松地推广自己的解决方案,或使用SpringGuicePico等框架。