如何在不同的登台环境中维护Java Web应用程序?

时间:2020-03-06 14:22:08  来源:igfitidea点击:

我们可能具有在开发人员机器上使用的一组属性,这些属性因开发人员的不同而有所不同,另一组用于暂存环境,另一组用于生产环境。

在Spring应用程序中,我们可能还具有要在本地环境而不是生产环境中加载的bean,反之亦然。

我们如何处理?我们是否使用单独的文件,ant / maven资源过滤或者其他方法?

解决方案

我将Ant的副本与筛选器文件一起使用。
在带有变量的配置文件的目录中,我有一个目录,其中包含针对每种环境的文件。构建脚本知道环境并使用正确的变量文件。

我只是为每台机器使用不同的Spring XML配置文件,并确保从这些Spring配置文件中加载的bean引用了机器之间不同的所有配置数据。

例如,我有一个连接到另一个应用程序的Java RMI界面的webapp。我的应用程序通过在Spring XML配置文件中配置的Bean获取该其他应用程序的RMI接口的地址。我的应用程序和另一个应用程序都具有开发,测试和生产实例,因此我的应用程序有三个配置文件-一个对应于生产实例的配置,一个对应于测试实例,一个对应于dev实例。

然后,我唯一需要保持的就是将哪个配置文件部署到哪台计算机上。到目前为止,我在创建Ant任务的策略方面还没有遇到任何问题,这些任务可以在生成WAR文件之前处理将正确的配置文件复制到位的问题。因此,在上面的示例中,我有3个Ant任务,一个生成生产WAR,一个生成开发WAR,另一个生成测试WAR。所有这三个任务都将正确的配置文件复制到正确的位置,然后调用相同的下一步,即编译应用程序并创建WAR。

希望这有道理...

单独的配置文件,存储在源代码控制存储库中,并手动更新。通常,一个版本与下一个版本之间的配置不会发生根本性的变化,因此同步(即使是手动完成)并不是真正的主要问题。

对于生产环境中具有高度可伸缩性的系统,我将严重推荐一种方案,其中将配置文件保留在模板中,并且作为构建脚本的一部分,这些模板用于呈现"最终"配置文件(所有环境都应使用相同的过程)。

我有不同的配置文件夹,其中包含用于目标部署的配置,并且我使用ANT选择在文件复制阶段要使用的配置文件夹。

我们使用特定于环境的属性文件,并在构建jar / wars时让ant构建选择正确的集合。

特定于环境的事物也可以通过目录服务(JNDI)处理,具体取决于应用服务器。我们使用tomcat,我们的DataSource是在Tomcat的只读JNDI实现中定义的。 Spring使查找非常容易。

我们还使用ant策略从同一个源项目中构建不同的站点(不同的内容,安全角色等)。

有一件事使我们对这种构建策略感到有点麻烦,那就是文件和目录通常要到构建运行后才存在,因此可能很难编写真正的集成测试(使用相同的弹簧套件)可以在IDE中运行)。我们还会错过一些IDE检查文件是否存在等功能。

我只是将各种属性放在JNDI中。这样,可以配置每个服务器,并且我可以拥有一个war文件。
如果属性列表很大,那么我将在另一台服务器上托管属性(或者XML)文件。我将使用JNDI来指定要使用的文件的URL。

如果要为每种环境创建不同的应用程序文件(war / ear),那么我们将不会部署与测试相同的war / ear。

在我的一个应用程序中,我们使用了几种REST服务。我只是将根URL放在JNDI中。然后,在每个环境中,可以将服务器配置为与该环境的适当REST服务进行通信。

我们针对不同的环境使用不同的蚂蚁目标。我们这样做的方式可能有点不雅,但行得通。我们将仅告诉某些ant目标以过滤出不同的资源文件(这是我们可以从加载中排除某些bean的方式),加载不同的数据库属性以及将不同的种子数据加载到数据库中。我们实际上并没有运行一个"专家"蚂蚁,但是我们能够通过一个命令以不同的配置运行我们的构建。

我见过的一种解决方案是配置过渡环境,使其与生产环境相同。这意味着每个环境都有一个具有相同IP范围的VLAN,并且计算机角色位于相同的IP地址上(例如,数据库集群IP在每个环境中始终为192.168.1.101)。防火墙将面向外部的地址映射到Web服务器,因此通过交换PC上的主机文件,可以根据需要使用相同的URL http://www.myapp.com/webapp/file.jsp进行登台或者生产,具体取决于我们交换了哪个主机文件。

我不确定这是否是理想的解决方案,虽然维护起来很麻烦,但是值得一提。

Caleb P和JeeBee可能是我们最快的解决方案。另外,我们不必设置其他服务或者指向不同计算机上的文件。我们可以通过使用$ {user.name}变量或者在Ant或者Maven的-D参数中指定配置文件来指定环境。

此外,在此设置中,我们可以具有通用属性文件,并可以覆盖特定环境的属性文件。 Ant和Maven均支持这些功能。

我使用Maven过滤掉项目中src / main / resources下的资源。我将其与属性文件结合使用,以在基于Spring的项目中引入自定义属性。

对于默认构建,我在主目录中有一个属性文件,Maven然后将其用作替代文件(因此可以正确找到本地Tomcat安装之类的内容)。测试服务器和生产服务器是我的其他配置文件。然后,只需一个简单的-Pproduction即可为我的生产服务器构建应用程序。

不要忘记研究PropertyPlaceholderConfigurer,这在无法使用JNDI的环境中特别有用

我最近还将Maven用于实时或者暂存环境的替代配置。使用Maven配置文件进行生产配置。希望能帮助到你。

使用不同的属性文件,并使用ant replace过滤器,它们将根据完成构建的环境进行替换。
参见http://www.devrecipes.com/2009/08/14/environment-specific-configuration-for-java-applications/