Java—防止多版本应用程序拆分代码库

Java—防止多版本应用程序拆分代码库,java,preprocessor,multiple-versions,Java,Preprocessor,Multiple Versions,我正在编写一个应用程序,它将以几种不同的版本发布(最初大约有10种代码库变体,需要维护)。当然,98%左右的代码在不同的系统中是相同的,保持代码库完整是有意义的 我的问题是——做这件事的首选方式是什么?例如,如果我有一个在某些版本(MyClassDifferent)中不同的类(MyClass),并且该类在几个地方被引用。我希望根据我正在编译的应用程序的版本来更改引用,而不是将引用MyClassDifferent的所有类都拆分。预处理器宏会很好,但它们会使代码膨胀,而且只有概念验证实现可用 我正在

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

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


我正在考虑类似工厂模式的东西,以及每个应用程序的配置文件。有人有什么建议吗?

你的思路是正确的:工厂模式、配置等


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

我支持您的工厂方法,您应该更仔细地了解maven或ant(取决于您使用的是什么)。 您可以部署不同的配置文件,根据参数/概要文件确定使用哪些类


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

幸运的是,您有几种选择

1) (java6内置)将类似MyClass的API类放在jar中,然后根据此API编译应用程序。然后使用/META-INF/services/com.foo.MyClass将MyClass的一个单独实现放在一个单独的jar中。然后,只需保持JAR的“分发”,就可以维护应用程序的多个版本。您的“main”类只是一组ServiceLoader调用

2) 与1)的架构相同,但使用Spring或Guice配置替换META-INF服务

3) 奥斯基


4) 您的解决方案可以查看AbstractFactory设计模式、“依赖项注入”和“控制反转”。马丁·福勒写过这些

简单地说,您提供了JAR文件以及所有需要的组件。对于每个可以自定义的服务点,您定义了服务的接口。然后编写该接口的一个或多个实现。要创建服务对象,请向AbstractFactory请求,例如:

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

实际类名是从每个站点唯一的属性文件中读入的

您可以很容易地推出自己的解决方案,或者使用类似、或的框架