单独的web.xml用于开发和生产

我的web.xml在开发和生产环境中有所不同。 例如,在开发环境中,不需要安全约束。

通常我部署新的应用程序版本如下:

  1. 将Eclipse项目导出为WAR。
  2. 将WAR上传到服务器。
  3. 重新部署。

问题是我必须在导出之前手动取消注释web.xml中的安全性约束。

你怎么解决这个问题?

我还在一些文章中遇到了“web.xml很少改变”的意见。 但是如果在每次更新时导出到WAR,web.xml怎么能不改变?

提前致谢!

如果在开发过程中无法使用相同的web.xml ,我会自动化构建过程,使用两个web.xml并在构建时捆绑“正确”,具体取决于Brian建议的目标环境。 但是,我选择Maven,而不是Ant,因为它需要较少的工作恕我直言,它有一个内置的function,称为配置文件 ,非常适合管理像这里的环境特定的东西。

换句话说,我将构建置于Maven 2下并使用包含特定maven-war-plugin配置的生产配置文件来构建包含具有所需安全性约束的web.xml的WAR。 另一种选择是合并开发web.xml ( 货物可以做到这一点)来添加安全约束,但这已经是一个更“先进”的解决方案(实施起来有点复杂)。

我将使用不同的web.xml配置创建开发和生产部署。 通过您的构建(Ant / Maven等)自动构建/维护这些内容,以保持对所需公共元素的控制。

我不得不在过去多次解决这个问题,最后编写XMLTask – 一个Ant插件,它允许修改XML文件而不使用普通文本替换(它比这更聪明)并且不必乱用XSLT(它是比那简单得多)。 如果您按照上述方法,您可能想要检查这一点。 这是我写的关于它的文章 。

假设您在部署到生产之前一直坚持改变web.xml的想法,那么我可能的方法是通过一个简单的XSL转换来运行开发web.xml ,该转换使用仅限生产来“装饰” web.xml元素,例如安全约束。 假设您可以将此步骤挂钩到构建过程中,那么在导出过程中应该会出现生产就绪的web.xml

但是,通常不要在不同环境中使用不同的web.xml ,这会使测试贬值。 在所有环境中具有相同的价值将降低仅在生产环境中出现错误的风险。

我将我的项目转换为使用ant构建的。 起点就是这个build.xml http://tomcat.apache.org/tomcat-6.0-doc/appdev/build.xml.txt

上面的构建没有在不同的web.xml中复制的function(基于例如构建时的属性集),但是当你进入ant时,你将学习如何做到这一点,应该很容易。

作为一个很好的副作用,部署到远程tomcat现在只需几次点击Eclipse内部而不是Export-> war并手动将其复制到服务器。

我会添加必要的基础设施,以允许机械构建,与ant或maven。

完成后,您可以让您的机械构建创建两个目标,一个用于测试,一个用于生产。

但是,您应该强烈考虑测试与生产中相同的代码。 否则你会被咬伤。

我认为在一个单独的战争中工作在多个环境中是一个优秀的解决方案,而不是每个dev,qual和prod使用配置文件选项烘焙新的战争。 令人讨厌的是没有更好的机制来直接在web.xml中获取环境变量而不使用像spring这样的库。

web.xml环境配置的一个解决方案,因为您的环境自定义与filter init params相关,例如:

  CAS Filter edu.yale.its.tp.cas.client.filter.CASFilter  edu.yale.its.tp.cas.client.filter.loginUrl https://:8443/login ... 

上面引用的特定filter类(CASFilter)是公共的。 这意味着您可以将其扩展为在您的环境配置中添加的自定义适配器。 这允许您远离那个讨厌的web.xml文件。