提问者:小点点

为Web应用程序设置指定的系统属性


我有一个JavaEE应用程序,它需要在运行时配置一些特定的系统属性。

在开发阶段,我们在. pom.xml中设置属性以使其工作:

        <plugin>
            <groupId>org.apache.tomcat.maven</groupId>
            <artifactId>tomcat7-maven-plugin</artifactId>
            <version>2.2</version>
            <configuration>
                <systemProperties>
                <xxx>true</xxx>
                </systemProperties>
            </configuration>
        </plugin>

然而,我想知道如果我们在正式生产环境中部署应用程序呢?

我想在servlet初始化期间设置属性,但一旦jvm运行(从这篇文章开始),我似乎无法修改系统属性:

热点Java实现的JVM内存参数只能在JVM启动/启动时通过命令行选项设置。在JVM启动之前或之后在系统属性中设置它们将无效。

我尝试在web. xml中设置属性(此处):

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

但它似乎没有影响。

那我就纳闷怎么解决呢?

BTW,在正式生产环境中,我们可能会在共享的tomcat下运行多个应用程序,因此我们更愿意仅在应用程序上下文下设置属性。


共2个答案

匿名用户

的<代码>

<env-entry>
  <env-entry-name>myProperty</env-entry-name>
  <env-entry-type>java.lang.String</env-entry-type>
  <env-entry-value>some-value</env-entry-value>
</env-entry>

如下访问代码库中的属性将返回一个null引用:

System.getProperty("myProperty");

尽管应该通过如下上下文查找来检索它:

Context initCtx = new InitialContext();
Context envCtx = (Context) initCtx.lookup("java:comp/env");

// Look up for your property "myProperty"
String myPropertyValue = (String) envCtx.lookup("myProperty");

主要优点是,您将能够拥有一个属性,该属性的值将因Web应用程序而异。但是这样,随着您部署的工件数量的增加,将很难维护它,我认为,根据我卑微的经验,它不建议用于生产环境。

如果你的目标是正式生产环境,我建议使用系统属性(你的代码源代码应该更新以遵循风格)。由于你使用Tomcat作为应用服务器,你有一种方法可以让你有中心属性定义,那就是声明一个名为setenv.sh. batfor WindowsOS)的文件,在那里你可以导出所有需要的系统属性,例如它可能包含的内容:

export CATALINA_OPTS="$CATALINA_OPTS -DmyProperty=some-value"

不需要更多的额外配置,如果在$CATLINA_HOME/bin或$CATLINA_BASE/bin下,启动JVM实例时默认会处理此文件。

匿名用户

您将web. xml env条目与系统环境混淆,系统属性java

要求您的ee服务器管理员在服务器定义中添加这些内容,例如

-dpropname=true