我的web.xml在开发和生产环境中有所不同。例如,在开发环境中,不需要安全约束。
通常我按如下方式部署新的应用程序版本:
问题是我必须在导出之前手动取消注释web.xml中的安全性约束。
你如何解决这个问题?
我在一些文章中也遇到了“web.xml很少改变”的意见。但是如果在每次更新时将web.xml导出为WAR,web.xml怎么能不改变呢?
提前致谢!
答案 0 :(得分:12)
如果在开发过程中无法使用相同的web.xml
,我会自动化构建过程,使用两个web.xml
并在构建时捆绑“正确”的一个,具体取决于Brian的目标环境建议。但是,我选择Maven,而不是Ant,因为它需要更少的工作恕我直言,它有一个内置的功能,称为profiles,非常适合管理像这里的环境特定的东西。
换句话说,我将构建置于Maven 2下并使用包含特定maven-war-plugin配置的 production 配置文件来构建包含web.xml
的{所需的安全限制。另一种选择是合并开发web.xml
(cargo可以做到这一点)来添加安全约束,但这已经是一个更“先进”的解决方案(实施起来有点复杂)
答案 1 :(得分:2)
我将使用不同的web.xml
配置创建开发和生产部署。通过您的构建(Ant / Maven等)自动构建/维护这些内容,以保持对所需公共元素的控制。
过去我不得不多次解决这个问题,最后编写了XMLTask - 一个Ant插件,它允许修改XML文件而不使用普通的文本替换(它比这更聪明)并且没有不得不搞乱XSLT(它比这简单得多)。如果您按照上述方法,您可能需要检查一下。 Here's an article我写了这篇文章。
答案 2 :(得分:0)
假设您在部署到生产之前一直坚持web.xml
更改的想法,那么我可能的方法是通过简单的XSL转换运行开发web.xml
,该转换“装饰”{ {1}}使用仅限生产的元素,例如安全性约束。假设您可以将此步骤挂钩到构建过程中,那么在导出过程中应该会出现生产就绪web.xml
。
但是,通常不要在不同环境中使用不同的web.xml
,这会使您的测试贬值。在所有环境中具有相同的价值将降低仅在您的生产环境中出现错误的风险。
答案 3 :(得分:0)
我将项目转换为使用ant构建。起点就是这个build.xml http://tomcat.apache.org/tomcat-6.0-doc/appdev/build.xml.txt
上面的构建没有在不同的web.xml中复制的功能(基于例如构建时的属性集),但是你会学到如何在进入ant时做到这一点,应该是漂亮的容易。
作为一个很好的副作用,部署到远程tomcat现在只需几次点击Eclipse内部而不是Export-> war并手动将其复制到服务器。
答案 4 :(得分:0)
我会添加必要的基础设施,以允许使用蚂蚁或专家进行机械构建。
完成任务后,您可以让机械构建创建两个目标,一个用于测试,一个用于生产。
但是,您应该强烈考虑测试与生产中相同的代码。否则你会被咬伤。
答案 5 :(得分:0)
我认为,在多个环境中运行的单一战争比使用dev,qual和prod的配置文件选项烘焙新的战争更好。如果不使用像spring这样的库,没有更好的机制直接在web.xml中获取环境变量。
web.xml环境配置的一个解决方案,因为您的环境自定义与filter init params相关,例如:
<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文件。