Java 单独使用web.xml进行开发和生产

Java 单独使用web.xml进行开发和生产,java,eclipse,web-applications,Java,Eclipse,Web Applications,My web.xml在开发环境和生产环境中是不同的。例如,在开发环境中,不需要安全约束 通常,我会按如下方式部署新的应用程序版本: 将Eclipse项目导出到WAR 将WAR上载到服务器 重新部署 问题是,在导出之前,我必须手动取消web.xml中的安全约束注释 你如何解决这个问题 我在一些文章中也遇到了这样一种观点:“web.xml很少改变”。但是,如果web.xml在每次更新时都被导出到WAR,它又怎么能不改变呢 提前谢谢 假设您坚持在部署到生产环境之前更改web.xml的想法,那么我可能的

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

通常,我会按如下方式部署新的应用程序版本:

  • 将Eclipse项目导出到WAR
  • 将WAR上载到服务器
  • 重新部署
  • 问题是,在导出之前,我必须手动取消web.xml中的安全约束注释

    你如何解决这个问题

    我在一些文章中也遇到了这样一种观点:“web.xml很少改变”。但是,如果web.xml在每次更新时都被导出到WAR,它又怎么能不改变呢


    提前谢谢

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


    然而,通常最好不要在不同的环境中使用不同的
    web.xml
    ,因为这会降低测试的价值。在所有环境中具有相同的价值将降低只在生产环境中出现错误的风险。

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


    在过去,我曾多次解决过这个问题,并最终编写了一个Ant插件,它允许修改XML文件,而无需使用普通的文本替换(比这聪明多了),也无需处理XSLT(比这简单多了)。如果您遵循上述方法,您可能需要检查一下。我写了这篇文章。

    我将我的项目转换为使用。起点就是这个build.xml

    上面的构建没有在不同的web.xml中进行复制的功能(例如,基于构建时的属性集),但是当您稍微了解ant时,您将了解如何进行复制,这应该非常容易


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

    如果在开发过程中不能使用相同的
    web.xml
    ,我会自动执行构建过程,使用两个
    web.xml
    并捆绑“正确的”正如Brian所建议的,在构建时根据目标环境选择一个。但是,我选择Maven而不是Ant,因为它需要的工作更少,而且它有一个内置的特性,称为,非常适合管理像这里这样的特定于环境的东西


    换句话说,我将构建放在Maven 2下,并使用包含特定Maven war插件配置的生产配置文件来构建包含具有所需安全约束的
    web.xml
    的war。另一个选择是合并开发
    web.xml
    (可以这样做)以添加安全约束,但这已经是一个更“高级”的解决方案(实施起来更复杂一些)。

    我将添加必要的基础设施,以允许使用ant或maven进行机械构建

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


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

    我相信,在多个环境中进行一场战争比根据dev、qual和prod使用profile选项烘焙一场新战争要好得多。这非常令人讨厌,没有更好的机制可以直接在web.xml中获取环境变量,而不使用spring这样的库

    考虑到您的环境自定义与筛选器init参数相关,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>
            ...
    
    
    CAS过滤器
    edu.yale.its.tp.cas.client.filter.CASFilter
    edu.yale.its.tp.cas.client.filter.loginUrl
    https://:8443/登录
    ...
    

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

    完美的答案,感谢您指出这些配置文件。投票给你!