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

Java 为web应用程序设置指定的系统属性,java,servlets,jvm,Java,Servlets,Jvm,我有一个JavaEE应用程序,它需要在运行时配置一些特定的系统属性 在开发阶段,我们在.pom.xml中设置属性以使其正常工作: <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <version&g

我有一个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>
但它似乎没有起作用

那么我想知道如何解决它


顺便说一句,在生产环境中,我们可能在一个共享tomcat下运行多个应用程序,因此我们只希望在应用程序上下文下设置属性。

您将web.xml env条目与system environment和java system properties混淆了

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


-Dpropname=true

您将web.xml env条目与带有java系统属性的系统环境混淆了

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

-Dpropname=true

环境条目
不适合您,因为
环境条目
可以通过
系统而不是通过
属性门面获得。
因此,如果您在部署描述符文件中配置以下条目:

<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>
尽管应通过上下文查找检索,如下所示:

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
.bat
for Windows OS)的文件,您可以在其中导出所有需要的系统属性,例如它可能具有的内容:

export CATALINA_OPTS="$CATALINA_OPTS -DmyProperty=some-value"
不再需要额外的配置,在启动JVM实例时,如果在$CATLINA\u HOME/bin$CATLINA\u BASE/bin环境条目下存在,则默认情况下将处理此文件
不适合您,因为
环境条目
可以通过
系统而不是通过
属性门面获得。
因此,如果您在部署描述符文件中配置以下条目:

<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>
尽管应通过上下文查找检索,如下所示:

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
.bat
for Windows OS)的文件,您可以在其中导出所有需要的系统属性,例如它可能具有的内容:

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

不需要更多的额外配置,如果JVM实例位于$CATLINA_HOME/bin$CATLINA_BASE/bin下,则在启动JVM实例时,默认情况下将处理此文件。您实际如何使用它们?您实际如何使用它们?