Java 如何管理特定于客户端的配置

Java 如何管理特定于客户端的配置,java,configuration,customization,Java,Configuration,Customization,对于多个客户机使用的产品,不同的客户机在用户界面和功能方面要求不同的自定义,如何适应这些更改,而不使代码与客户机特定的代码混淆 是否有任何框架(针对任何编程语言)可以帮助实现这一点 要添加更多细节,UI是基于web的,并使用JSP编写。简单怎么样?设置一个真实的接口/基类,并根据某种配置,根据客户机实例化子类a或B。对于这样一个与语言无关的问题,很难提供更多的细节,但我认为这是非常现实的。这个问题的一个解决方案,在Win32/.NET世界中很常见,就是将特定于客户端的“代码”移到资源文件中。许多

对于多个客户机使用的产品,不同的客户机在用户界面和功能方面要求不同的自定义,如何适应这些更改,而不使代码与客户机特定的代码混淆

是否有任何框架(针对任何编程语言)可以帮助实现这一点


要添加更多细节,UI是基于web的,并使用JSP编写。

简单怎么样?设置一个真实的接口/基类,并根据某种配置,根据客户机实例化子类a或B。对于这样一个与语言无关的问题,很难提供更多的细节,但我认为这是非常现实的。

这个问题的一个解决方案,在Win32/.NET世界中很常见,就是将特定于客户端的“代码”移到资源文件中。许多.NET项目(.NET通过名称空间内置了对此模式的支持)通过将UI字符串放入每种语言的一个文件中,然后在运行时从相应的文件加载UI字符串,将此模式用于国际化

此模式如何应用于JSP应用程序?在这里,您可以为每个客户机保留一个资源文件(或者使用数据库代替文件),并在提供页面时从资源文件加载特定于用户的自定义设置

例如,假设您的最大客户希望将他们的徽标覆盖在您站点中每个网页的某些部分上。您的页面可以加载
CustomerLogo
属性,并将其用作页面该部分HTML图像的src属性。如果将页面提供给重要客户,则加载URL“/static/images/importantCustomerLogo.png”,否则返回默认资源文件,该文件指定URL“/static/images/logo.png”


通过这种方式,您可以抽象出将属性加载到一个或两个Java文件中的代码,并在整个网站中使用这些属性。代码库中唯一特定于客户的部分是资源文件集,这些文件可以是干净的XML格式,易于阅读和修改。结果是,最初没有开发应用程序的人可以修改XML,而不必先阅读代码,因此您不必维护资源文件,销售部门可以为您完成这项工作。

GWT通过一个名为

编译GWT应用程序时,编译器实际上会为每个不同的浏览器生成不同版本的代码。这是自动完成的开箱即用的GWT组件照顾不同的浏览器血淋淋的细节

此功能可以扩展为基于自定义属性生成任意编译。下面是一个简化的示例:假设您对普通视图和详细视图有不同的视图定义

public abstract class AbstractView { ....}
public abstract class NormalView extends AbstractView { ... }
public abstract class DetailedView extends AbstractView { ....}
您可以创建一个模块定义,该定义将生成两个不同的版本,一个使用
NormalView
类,另一个使用
DetailedView
(在您的gwt.xml文件中)

将在运行时提供适当的实例

您可以将特定于客户端的代码封装到特定的类中,并为不同的实现公开公共接口

您还需要根据当前查看的客户端选择适当的编译版本(您可以使用jsp进行此操作)


请不要将上面的代码示例作为测试样本,语法可能有问题,这只是为了传达一般的想法


JSP后端是GWT应用程序的理想宿主环境,您将能够利用requestfactory机制在客户端和服务器之间轻松通信


显然这里有一个学习曲线,IMO是一个很好的起点

这是管理同一应用程序的不同版本的最困难的业务需求之一,因此不要指望这种情况下会出现开放式框架,但是每个相关公司都会为类似的事情开发自己的系统

至于业务逻辑修改,您将受益于强大的接口和IoC(例如Spring)。您将覆盖特定案例的服务,并更改所需的方法,然后将服务的修改版本注入IoC

至于UI,它更难,因为您选择了JSP,它几乎没有灵活性。当你们在Swing或GWT中编程时,你们可以用同样的方法修改UI——覆盖需要的UI类,修改它们,注入修改过的版本。有了JSP-Propable,定制版本中的.JSP文件将有很多修改

现在,变更修改/错误修复-版本控制系统得到了充分利用。当然,特定于客户的版本是分支,而标准的主版本是主干。对主干进行错误修复,然后合并到特定于客户的分支。使用接口/覆盖实现时,大多数合并都是简单的方法,但是,使用JSP时,我希望冲突经常发生


一般来说,代码更改合并比任何基于XML的更改都要容易。

我想您可能会尝试阅读OSGi相关的文章(或书籍)…这个平台将为您的模块化问题提供一个非常实用的答案。它特别设计为能够处理具有依赖关系和版本控制的不同模块。 正如在前面的回答中提到的,通过OSGi声明性服务进行依赖注入是Spring的一个非常有价值的替代方案,具有动态功能。。部署一个提供服务的捆绑包,您的引用将自动更新,删除它,它们也将刷新。。。 看看这项技术,然后问一些问题? 当做
jerome

配置语言不可知?我不这么认为……谢谢你的回答。UI元素呢?
<define-property name="customMode" values="normal,detailed" />

<replace-with class="com.example.NormalView">
  <when-type-is class="com.example.AbstractView" />
  <when-property-is name="customMode" value="normal" />
</replace-with>

<replace-with class="com.example.DetailedView">
  <when-type-is class="com.example.AbstractView" />
  <when-property-is name="customMode" value="detailed" />
</replace-with>
AbstractView view = GWT.create(AbstractView.class);