我有一个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.xml
(here)中设置属性:
<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下运行多个应用程序,因此我们更喜欢仅在应用程序上下文中设置属性。答案 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 =真