Java web应用程序中的多个版本:重复还是混乱的代码?

Java web应用程序中的多个版本:重复还是混乱的代码?,java,Java,我习惯于在Git中管理带有标记的版本。但对于独立应用程序来说,这已经是很久以前的事了。现在的问题是,我有一个web应用程序,在同一个应用程序中,可能会连接希望与不同版本的应用程序通信的客户端 因此,我以这种方式向输入中添加了版本的path变量: @PathParam("version") String version 客户端可以在URL中指定版本: https://whatever.com/v.2/show 然后,我在代码中添加了如下条件: if(version.equals("v.2")

我习惯于在Git中管理带有标记的版本。但对于独立应用程序来说,这已经是很久以前的事了。现在的问题是,我有一个web应用程序,在同一个应用程序中,可能会连接希望与不同版本的应用程序通信的客户端

因此,我以这种方式向输入中添加了版本的path变量:

@PathParam("version") String version
客户端可以在URL中指定版本:

https://whatever.com/v.2/show
然后,我在代码中添加了如下条件:

if(version.equals("v.2") {
    // Do something
}
else if(version.equals("v.3") {
    // Do something else
}
else {
    // Or something different
}
问题是我的代码变得非常混乱。所以我决定用另一种方式。我只在代码的一个点中添加了这个条件,然后根据版本调用不同的类:

MyClassVersion2.java
MyClassVersion3.java
MyClassVersion4.java
现在的问题是我有很多重复

我也想解决这个问题。我现在如何才能拥有一个web应用程序:

1) Deal with multiple versions
2) It is not messy (with a lot of conditions)
3) Doesn't have much duplication

您的版本号位于URL中名为“Context Root”的位置。 您可以发布多个不同的WAR文件,每个文件都配置为在不同的上下文根上响应。 所以一场战争是为了版本1,一场战争是为了版本2等等

这将导致代码重复。 因此,您真正要问的是,“如何有效地对Java web应用程序进行模块化?”

这是一个大问题,它将引导您进入“企业Java”。 本质上,您需要通过将通用代码抽象到不同的应用程序来解决这个问题。通常这称为“n层”设计。 因此,您将创建一个“集成层”应用程序,您的“表示”层war文件将与之对话。 集成层包含所有公共代码,因此不会重复

您的集成层可以是EJB或Web服务等。
或者您可以研究使用OSGi。

通常,当我们谈到应用程序的旧版本时,我们的意思是该版本的行为和外观是一成不变的,不会改变。如果您对该应用程序的源文件做了哪怕是最轻微的修改,那么它的行为和/或外观可能会改变(根据墨菲定律,它会改变),这是不可接受的

因此,如果我是你,我会将旧版本的所有源文件锁定在源代码存储库中,这样任何人都无法提交它们。这种方法解决了这个问题,并规定了您必须如何处理其他所有事情:每个版本都必须有自己的源文件集,这些源文件集与所有其他版本的源文件完全无关


现在,如果应用程序的旧版本必须与最新版本有一些共同之处,并且这一点发生了变化(比如数据库),那么我们并不是在讨论应用程序的不同版本,我们有一些更类似于不同皮肤的东西:应用程序的核心不断发展,但不久前挑选皮肤的用户可以坚持使用该皮肤。在这种情况下,其他人已经提出的多态性解决方案可能是更好的方法。

这似乎是CodeReview的一个问题(CodeReview.stackexchange.com)但即使这样,您也必须发布更多的代码,以便在某种程度上了解
根据版本调用不同类背后的总体结构。使用方法sharedSee方法2实现父类
MyClassVersion
:(对于v2、v3、v4,使用多态性和单独的控制器/处理程序/服务/任何东西。问题是……如果我在控制器下面有五个抽象级别的版本感知代码,我就无法用多态性真正解决这个问题。