【问题标题】:Separate web.xml for development and production单独的 web.xml 用于开发和生产
【发布时间】:2010-12-21 10:07:18
【问题描述】:
我的 web.xml 在开发和生产环境中是不同的。例如在开发环境中不需要安全约束。
通常我会按如下方式部署新的应用程序版本:
- 将 Eclipse 项目导出到 WAR。
- 将 WAR 上传到服务器。
- 重新部署。
问题是我必须在导出之前手动取消注释 web.xml 中的安全约束。
你如何解决这个问题?
我在一些文章中也遇到了“web.xml 很少更改”的观点。但是如果 web.xml 在每次更新时都导出到 WAR,它怎么能不改变呢?
提前致谢!
【问题讨论】:
标签:
java
eclipse
web-applications
【解决方案1】:
如果您在开发过程中不能使用相同的web.xml,我会自动化构建过程,使用两个web.xml,并在构建时根据Brian 建议的目标环境捆绑“正确”的一个。但是,我会选择 Maven 而不是 Ant,因为它需要更少的工作恕我直言,并且它有一个名为 profiles 的内置功能,非常适合管理像这里这样的环境特定的东西。
换句话说,我会将构建放在 Maven 2 下,并使用包含特定 maven-war-plugin 配置的 production 配置文件来构建包含具有所需安全性的 web.xml 的 WAR约束。另一种选择是合并开发web.xml(cargo 可以这样做)以添加安全约束,但这已经是更“高级”的解决方案(实施起来更复杂)。
【解决方案2】:
我将使用不同的 web.xml 配置创建开发和生产部署。通过您的构建(Ant/Maven 等)自动化这些构建/维护,以控制所需的常见元素。
过去我不得不多次解决这个问题,最后写了 XMLTask - 一个 Ant 插件,它允许在不使用普通文本替换的情况下修改 XML 文件(它比这更聪明)并且无需与 XSLT 混淆(比这简单得多)。如果您遵循上述方法,您可能需要检查一下。 Here's an article我写过。
【解决方案3】:
假设您坚持在部署到生产之前更改 web.xml 的想法,那么我可能的方法是通过简单的 XSL 转换运行开发 web.xml,该转换用您的“装饰”web.xml仅生产元素,例如安全约束。假设您可以将此步骤挂钩到您的构建过程中,那么生产就绪的web.xml 应该会在您的导出过程中出现。
但是,在不同环境中不要使用不同的web.xml 通常是个好主意,这会降低您的测试价值。在所有环境中使用相同的值将降低错误仅出现在您的生产环境中的风险。
【解决方案5】:
我会添加必要的基础设施以允许使用 ant 或 maven 进行机械构建。
完成后,您可以让您的机械构建创建两个目标,一个用于测试,一个用于生产。
但是,您应该强烈考虑测试与生产中相同的代码。不然你会被咬的。
【解决方案6】:
我相信,与每个开发人员、质量人员和产品人员使用配置文件选项烘焙新的战争相比,在多个环境中运行的单一战争是一种更好的解决方案。非常烦人的是,没有更好的机制可以直接在 web.xml 中获取环境变量而不使用 spring 之类的库。
web.xml 环境配置的一种解决方案,因为您的环境自定义与过滤器初始化参数有关,例如:
<filter>
<filter-name>CAS Filter</filter-name>
<filter-class>edu.yale.its.tp.cas.client.filter.CASFilter</filter-class>
<init-param>
<param-name>edu.yale.its.tp.cas.client.filter.loginUrl</param-name>
<param-value>https://<foo>:8443/login</param-value>
...
上面引用的特定过滤器类 (CASFilter) 是公共的。这意味着您可以将其扩展为添加到您的环境配置中的自定义适配器。这可以让您远离那个讨厌的 web.xml 文件。