在web.xml中引用环境变量

时间:2009-09-10 10:00:14

标签: java environment-variables web.xml

我预先打包了一个JSP web-app,它依赖于web.xml中的一些文件路径设置。这些设置在打包时是未知的,因为它们引用了客户在部署整个应用程序时设置的路径(其中web-app是管理界面)。

似乎在我的安装程序脚本中避免令牌和文件修改的最简单方法是询问用户安装位置,将此位置设置为环境变量(例如JAVA_HOME),并让web.xml始终引用变量

有没有办法从web.xml中引用环境变量值? Google搜索引出了来自ejb xml文件的SETTING环境变量的J2EE方法。这不是我想要的。

7 个答案:

答案 0 :(得分:35)

您可以在任何tomcat xml配置文件中使用Ant样式的变量替换,例如:

<servlet-mapping>
    <servlet-name>mvc-dispatcher</servlet-name>
    <url-pattern>${foo}</url-pattern>
</servlet-mapping>

fooJava System Property(sysprop)。

你不能直接使用OS Environment Variables(envvars),我认为......

要使用envvars,您可以输入

set "CATALINA_OPTS=-DsomeJavaSysProp=%SOME_OS_ENVVAR%"

bin/setenv.bat中(或类似地在bin/setenv.sh中为* nix)。您可能需要创建该文件。 Tomcat将在启动时运行此文件。

由于CATALINA_OPTS是一个envvar(而不是命令行选项),它不应该被系统上的其他用户看到(保存古老的Unix),尽管我还没有测试过。

http://tomcat.apache.org/tomcat-7.0-doc/config/

如果您使用的是Spring,则可以创建一个<context:property-placeholder/> bean,然后直接在Spring XML配置文件中使用envvars或sysprops(尽管不是web.xml)。

答案 1 :(得分:11)

我认为您不想使用环境变量(我认为无法从web.xml访问),但环境条目 [12] 。像这样:

<env-entry>
    <env-entry-name>Bla/SomeFilePath</env-entry-name>
    <env-entry-type>java.lang.String</env-entry-type>
    <env-entry-value>/opt/bla</env-entry-value>
</env-entry>

您可以使用SomeFilePath,如:

InitialContext ic = new InitialContext();
String s = (String) ic.lookup("java:comp/env/ejb/Bla/SomeFilePath");

答案 2 :(得分:8)

基本上,你不这样做。 web.xml应该包含事物的默认值,是的,但是在实际进行部署时应该覆盖它们。如果要部署到Tomcat,则可以通过在用于部署的context.xml中包含适当的条目来执行此操作。例如:

<Context path="/app">
    <!-- For things described by webapp parameters -->
    <Parameter name="foobar" value="grill" />

    <!-- For things described by environment entries -->
    <Environment name="Bla/SomeFilePath" type="java.lang.String"
            value="/opt/bla" />
</Context>

其他容器将有自己的机制来执行此操作。您必须查找他们的文档(或者更加关注您的帮助请求)。

答案 3 :(得分:1)

我不完全清楚你的局限性,但也许你可以做到这一点(我假设它是你试图配置的init-param):

1)在web.xml中保留未指定的变量
2)创建一个ServletContextListener并将其添加到您的应用程序中 3)监听servlet的初始化
4)在该点设置servlet的init-param

我尝试了类似的问题,但它失败了,因为事实证明第三方servlet(我也不想搞砸)实际上根本不是一个servlet,所以上下文从未初始化。但也许这里有机会......

答案 4 :(得分:1)

您必须按顺序放置env条目:

<env-entry>
  <env-entry-name>maxAmount</env-entry-name>
  <env-entry-type>java.lang.String</env-entry-type>
  <env-entry-value>aString</env-entry-value>
</env-entry>

否则,您将在web.xml上验证错误

参考:https://community.oracle.com/thread/840452?tstart=0

答案 5 :(得分:1)

可以在xml文件中访问环境变量,如下所示:

${env.ENVIRONMENT_VARIABLE_NAME}

很显然,用户帐户设置和访问问题可能存在问题,但是我已经尝试过使用系统变量,并且有效!

答案 6 :(得分:0)

如果您使用的是 Spring -您可以通过ConfigurableBeanFactory.resolveEmbeddedValue通过FilterConfigweb.xml中启用属性占位符插值支持。

使FilterConfig参数可解析的代理类。

public class ResolvableFilterConfig implements FilterConfig {

    private final FilterConfig source;
    private final ConfigurableBeanFactory resolver;

    public ResolvableFilterConfig(FilterConfig source, ConfigurableBeanFactory resolver) {
        this.source = source;
        this.resolver = resolver;
    }

    @Override
    public String getFilterName() {
        return source.getFilterName();
    }

    @Override
    public ServletContext getServletContext() {
        return source.getServletContext();
    }

    @Override
    public String getInitParameter(String name) {
        final String value = source.getInitParameter(name);
        return resolver.resolveEmbeddedValue(value);
    }

    @Override
    public Enumeration<String> getInitParameterNames() {
        return source.getInitParameterNames();
    }
}

过滤器实现示例代码

    @Override
    public void init(FilterConfig config) throws ServletException {
        // configure
        final ServletContext servletContext = config.getServletContext();
        final AbstractApplicationContext aac = (AbstractApplicationContext) getRequiredWebApplicationContext(servletContext);
        final ConfigurableBeanFactory beanFactory = aac.getBeanFactory();
        config = new ResolvableFilterConfig(config, beanFactory);
        // ... do the rest
    }