0

我们正在实施一个企业财务网络应用软件。我们正在使用 spring、hibernate、oracle(DB)、JSF。需求在软件的维护阶段发生变化,由于以前版本的软件的兼容性,我们必须同时拥有某些实体(也包括管理器、表单、...类)的多个版本。类的更改包括:添加/删除字段、更改字段、添加/删除类……一般来说,这个问题是同时运行多个版本的软件。请帮助我找到解决此问题的方法。

澄清:

此问题与软件产品线中的“时间可变性”类似(有关更多信息,请参阅elsner_vamos2010)。这意味着我们可能同时拥有一个类的多个版本,并且我们必须获取带有(或日期)参数的类。在每个日期,必须使用一个版本的课程,因为与该日期的程序状态兼容。我们用 XML 文件在 Bean 类上解决了这个问题,并得到了带有日期的类的版本。因此,程序知道必须为这种程序状态(其他实体的日期)运行什么 bean。

但是对于spring中的实体、jsp、form等其他对象类型我们解决不了?

4

4 回答 4

1

你看过OSGi吗?它提供的功能之一是不同的客户端类能够同时访问它们所依赖的类的不同版本。反正我是这么理解的,虽然我自己没用过。

于 2011-09-21T13:29:55.110 回答
1

您可以在不同的 WAR/EAR 中部署不同版本的项目。在这种情况下,您的容器将自动处理它们。每个war都会用自己的类加载器加载,所以同一个类(包和类名)的不同版本不会相交。这个选项是否足够好?

于 2011-09-21T11:24:08.473 回答
0

很难说这在您的情况下是否可行,但我会尽量避免与 Classloaders 混在一起。它本身就是一个困难的领域,WebAppServers 也倾向于用 Classloaders 做自己的事情。

我会尝试使其成为两个独立的 Web 应用程序,可能托管在同一台服务器上并通过数据库进行通信(假设您的应用程序无论如何都有一个)

于 2011-09-21T11:25:18.450 回答
0

听从 Jens Schauder 的建议,避免有趣的类加载篡改。

如果我们谈论的是您的应用程序必须跨多个版本支持的 Web 服务、EJB 或类似接口,也许您可​​以采用 ESB 调解器的方法,将(在可能的情况下)Vn-x 请求和响应转换为 Vn 请求和响应(其中 n 是您的最新版本)。如果可以仅使用映射、简单函数或聚合(想想 XSLT 或 XQuery 处理)将一条消息转换为另一条消息,并且不需要在请求之间保留状态,则可以这样做。任何体面的服务巴士都会这样做。

对于无状态转换不可行的情况,您可以以 Vn 版本支持 Vn、Vn-1、Vn-2... API 的方式开发/调整您的代码。您可能必须使用版本外观来消除具有相同签名的操作/方法的歧义(v1 putX 可能具有与 v2 putX 不同的行为)。这允许您在 Vn 代码中更改它们的实现名称,同时在它们各自版本的外观中维护它。显然,外部系统只能看到外墙。

如果您无法做到这一点,请分别部署不同的应用程序。

最后,您的架构。

如果您采用最新版本支持以前的 API 的方法,那么您的应用程序 Vn 是唯一访问数据库的方法。您必须调整架构以适应其需求,并从旧架构版本(如果存在)迁移数据。完毕。

如果不这样做,则您有多个版本的应用程序正在运行并访问数据库。在这种情况下,您必须让数据库“具体模式”支持不同的“逻辑模式”。请参阅有关数据库重构的这本书。这涉及使用几种技术,通过巧妙地使用触发器、视图、同义词等,您的架构支持与多个应用程序版本的交互。这看起来很棘手,但非常可行。

于 2011-09-21T18:56:31.797 回答