我有一个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下运行多个应用程序,因此我们更愿意仅在应用程序上下文下设置属性。
的<代码>
<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
(. bat
for WindowsOS)的文件,在那里你可以导出所有需要的系统属性,例如它可能包含的内容:
export CATALINA_OPTS="$CATALINA_OPTS -DmyProperty=some-value"
不需要更多的额外配置,如果在$CATLINA_HOME/bin或$CATLINA_BASE/bin下,启动JVM实例时默认会处理此文件。
您将web. xml env条目与系统环境混淆,系统属性java
要求您的ee服务器管理员在服务器定义中添加这些内容,例如
-dpropname=true