如何在启动时在Tomcatconfiguration中指定系统属性?

我知道我可以通过使用-Dparameter passing参数来指定Tomcat的系统属性,例如“ -Dmy.prop = value ”。

我想知道是否有一个更干净的方式来做到这一点,通过在context.xml文件或其他一些tomcatconfiguration文件中指定属性值。 我想这样做是因为首先,跟踪我的属性更容易,其次,我有多个上下文运行,我不知道如何通过-D参数指定上下文特定的属性。

我正在使用Tomcat版本5.5。

(更新:如果我可以删除这个答案,虽然我接受,但我不能,我正在更新说明以提供更好的指导,并劝阻人们使用我在原答案中列出的不良做法)。

您可以通过上下文或环境参数(如context.xml中)指定这些参数。 请参阅本页上的“上下文参数”和“环境条目”部分:

http://tomcat.apache.org/tomcat-5.5-doc/config/context.html

正如@netjeff指出的那样,这些值将通过Context.lookup(String)方法而不是系统参数。

另一种指定这些值的方法是在您正在部署的Web应用程序的web.xml文件中定义variables(请参见下文)。 正如@Roberto Lo Giacco所指出的那样,这通常被认为是不好的做法,因为部署的产品不应该是特定于环境的。 不过,如果你真的想这样做,下面是configuration代码片段:

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

当只使用System.getProperty()时,build议使用<env-entry> cliff.meyers的原始答案将无济于事。

根据Tomcat 6.0文档<env-entry>是针对JNDI的 。 所以这意味着它不会对System.getProperty()有任何影响。

cliff.meyers的例子中的<env-entry> ,下面的代码

 System.getProperty("SMTP_PASSWORD"); 

将返回null,而不是值“abc123ftw”。

根据Tomcat 6文档,要使用<env-entry>你必须编写这样的代码来使用<env-entry>

 // Obtain our environment naming context Context initCtx = new InitialContext(); Context envCtx = (Context) initCtx.lookup("java:comp/env"); // Look up our data source String s = (String)envCtx.lookup("SMTP_PASSWORD"); 

警告:我实际上没有尝试上面的例子。 但是我用System.getProperty()试过了<env-entry> ,那绝对不行。

一般来说,不应该依赖系统属性来configuration一个webapp – 它们可能被用来configuration容器(例如Tomcat),但不能运行在tomcat中的应用程序。

cliff.meyers已经提到了你应该使用你的web应用程序的方式。 这是标准的方式,这也适合您通过context.xml或server.xml的方式来configuration的问题。

也就是说,如果你真的需要tomcat中的系统属性或其他jvm选项(比如最大内存设置),你应该创build一个名为“bin / setenv.sh”或者“bin / setenv.bat”的文件。 这些文件不存在于您下载的标准归档中,但如果它们存在,则在启动过程中(如果通过startup.sh/startup.bat启动tomcat)执行内容。 这是将你自己的设置从标准的tomcat设置中分离出来的一种很好的方式,并且使得更新变得更容易。 无需调整startup.sh或catalina.sh。

(如果你执行tomcat作为windows servive,你通常使用tomcat5w.exe,tomcat6w.exe等来configuration服务的registry设置。)

编辑:另外,另一种可能性是去JNDI资源 。

也可以让ServletContextListener设置系统属性:

 import java.util.Enumeration; import javax.servlet.*; public class SystemPropertiesHelper implements javax.servlet.ServletContextListener { private ServletContext context = null; public void contextInitialized(ServletContextEvent event) { context = event.getServletContext(); Enumeration<String> params = context.getInitParameterNames(); while (params.hasMoreElements()) { String param = (String) params.nextElement(); String value = context.getInitParameter(param); if (param.startsWith("customPrefix.")) { System.setProperty(param, value); } } } public void contextDestroyed(ServletContextEvent event) { } } 

然后把它放到你的web.xml中(应该也可以用于context.xml)

 <context-param> <param-name>customPrefix.property</param-name> <param-value>value</param-value> <param-type>java.lang.String</param-type> </context-param> <listener> <listener-class>servletUtils.SystemPropertiesHelper</listener-class> </listener> 

它为我工作。

在tomcatconfiguration上设置系统属性的另一种方法是使用CATALINA_OPTS环境variables

这个问题在Apache wiki中解决。

问题:“我可以为每个webapp设置不同的Java系统属性吗?

答案:不可以。如果您可以编辑Tomcat的启动脚本(或者更好地创build一个setenv.sh文件),则可以向Java添加“-D”选项。 但是在Java中,没有办法在同一个JVM中为不同的类使用不同的系统属性值。 还有其他一些方法可用,比如使用ServletContext.getContextPath()获取Web应用程序的上下文名称,并相应地find一些资源,或者定义Web应用程序的WEB-INF / web.xml文件中的元素,然后设置Tomcat上下文文件(META-INF / context.xml)中的值。 请参阅http://tomcat.apache.org/tomcat-7.0-doc/config/context.html

http://wiki.apache.org/tomcat/HowTo#Can_I_set_Java_system_properties_differently_for_each_webapp.3F

您可以在<tomcat installation directory>/conf目录中的catalina.properties文件中添加必要的属性。

参考: https : //tomcat.apache.org/tomcat-8.0-doc/config/index.html

所有系统属性都可用,包括使用-D语法设置的那些属性,由JVM自动提供的那些属性以及在$ CATALINA_BASE / conf / catalina.properties文件中configuration的属性。