如何同时管理多个版本的类?

时间:2011-09-21 11:17:18

标签: java classloader software-product-lines

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

澄清:

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

但是我们无法解决Spring中其他对象类型的问题,例如entity,jsp,form?

4 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

你有没有看过OSGi?它提供的功能之一是能够让不同的客户端类同时访问它们所依赖的类的不同版本。无论如何,这就是我的理解,尽管我自己并没有使用它。

答案 2 :(得分:0)

很难说你的情况是否可行,但我会努力避免使用类加载器。它本身就是一个困难的领域,WebAppServers也倾向于使用类加载器做自己的事情。

我会尝试将它分成两个独立的Web应用程序,可能托管在同一台服务器上并通过数据库进行通信(假设您的应用程序已经安装了一个)

答案 3 :(得分:0)

接受Jens Schauder的建议并避免有趣的类加载篡改。

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

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

如果您不能这样做,请将您的不同应用程序单独部署。

最后,您的架构。

如果采用上一版本支持以前API的方法,则应用程序Vn是唯一访问数据库的方法。您必须根据需要调整架构,并从旧架构版本迁移数据(如果存在)。完成。

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