Java 在启动时替换web.xml变量

Java 在启动时替换web.xml变量,java,filter,war,web.xml,Java,Filter,War,Web.xml,我有一个web.xml文件,它在过滤器的context param和init param中包含变量。我想用应用程序启动时从属性文件获取的值替换此变量 我的web.xml是这样的: <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:sch

我有一个web.xml文件,它在过滤器的context param和init param中包含变量。我想用应用程序启动时从属性文件获取的值替换此变量

我的web.xml是这样的:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">

<display-name>APP NAME</display-name>
<description>
    App description
</description>
<context-param>
    <param-name>my-param-name</param-name>
    <param-value>${my-param-name}</param-value>
</context-param>
<filter>
    <filter-name>Authentication Filter</filter-name>
    <filter-class>my.app.Filter</filter-class>
    <init-param>
        <param-name>filter-var-name</param-name>
        <param-value>${filter-var-value}</param-value>
    </init-param>
</filter>
...
</web-app>
以下是部署的工作原理:

1) 部署工具读取给定的属性文件,用PROD或Dev值(在该工具中设置的值)替换变量,并将该文件推送到JBoss下的应用程序模块

2) 在JBoss上启动应用程序的部署。我希望web.xml变量在启动时被属性文件值替换


提前感谢。

我们创建了一个包装过滤器,它扩展了Servlet过滤器以设置web.xml过滤器变量的值。这些值取自DEV和PROD环境的外部属性文件

Web.xml:

...
<filter>
    <filter-name>CAS Authentication Filter</filter-name>
    <filter-class>my.package.WrappedFilter</filter-class>
    <init-param>
        <param-name>key</param-name>
        <param-value>wrappedCasFilter</param-value>
    </init-param>
    <init-param>
        <param-name>class</param-name>
        <param-value>org.jasig.cas.client.authentication.AuthenticationFilter</param-value>
    </init-param>
</filter>
...

很遗憾,我无法向您显示WrappedFilter内容。

我们创建了一个WrappedFilter,它扩展Servlet filter以将值设置为web.xml filters变量。这些值取自DEV和PROD环境的外部属性文件

Web.xml:

...
<filter>
    <filter-name>CAS Authentication Filter</filter-name>
    <filter-class>my.package.WrappedFilter</filter-class>
    <init-param>
        <param-name>key</param-name>
        <param-value>wrappedCasFilter</param-value>
    </init-param>
    <init-param>
        <param-name>class</param-name>
        <param-value>org.jasig.cas.client.authentication.AuthenticationFilter</param-value>
    </init-param>
</filter>
...

很遗憾,我无法向您展示WrappedFilter内容。

您能详细说明为什么要这样做吗?如果只是“不干扰WebApp.Web.xml”,则应该考虑使用这些参数的上下文参数,并将它们配置在部署上(在上下文中单独的上下文.xml中)关于这一点,有两种想法:a)直接替换web.xml中的值,而不是步骤1中的属性文件,或者重新编码过滤器,并放置您访问上下文参数来读取属性值。第一个是我现在拥有的,但不好,因为我必须为PROD和DEV提供一个war文件。我无法实现第二个建议,因为我不能重新编码所有过滤器。DEV和PROD将在不同的JBoss实例中运行,对吗?大多数应用服务器都允许在XML文件中进行某种类型的变量替换(tomcat:with system properties)。也许这是一个可行的选择?也许这是有帮助的?你能详细说明你为什么要这样做吗?如果只是“不干扰WebApp.Web.xml”,则应该考虑使用这些参数的上下文参数,并将它们配置在部署上(在上下文中单独的上下文.xml中)关于这一点,有两种想法:a)直接替换web.xml中的值,而不是步骤1中的属性文件,或者重新编码过滤器,并放置您访问上下文参数来读取属性值。第一个是我现在拥有的,但不好,因为我必须为PROD和DEV提供一个war文件。我无法实现第二个建议,因为我不能重新编码所有过滤器。DEV和PROD将在不同的JBoss实例中运行,对吗?大多数应用服务器都允许在XML文件中进行某种类型的变量替换(tomcat:with system properties)。也许这是一个可行的选择?也许这有帮助?
wrappedCasFilter.init.casServerLoginUrl = https://URL