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

时间:2014-07-05 03:30:27

标签: java servlets jvm

我有一个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运行后修改系统属性(来自this post):

  

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

我尝试在web.xmlhere)中设置属性:

<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 个答案:

答案 0 :(得分:4)

环境条目

<env-entry>无法为您制作,因为Environmental Entries可以通过JNDI而不是System属性外观。 因此,如果在部署描述符文件中配置以下条目:

<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>

如下所示访问codebase中的属性将返回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作为Application Server,因此您有一种方法可以让您拥有中心属性定义,即为 Windows声明名为setenv.sh.bat的文件操作系统)您导出所有需要的系统属性,例如它可能具有的内容:

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

不再需要其他配置,并且在启动JVM实例时默认情况下将处理此文件(如果存在于 $ CATLINA_HOME / bin < EM> $ CATLINA_BASE /斌的

答案 1 :(得分:1)

您将web.xml env条目与具有Java系统属性的系统环境混淆

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

-Dpropname =真