如何在启动时在Tomcat配置中指定系统属性?

Mar*_*kus 73 tomcat properties system-properties context.xml

我知道我可以通过使用-D参数传递参数来为Tomcat指定系统属性,例如" -Dmy.prop = value ".

我想知道是否有更简洁的方法通过在context.xml文件或其他一些tomcat配置文件中指定属性值来实现此目的.我想这样做是因为,首先,跟踪我的属性更容易,其次,我有多个上下文运行,我不知道如何通过-D参数指定特定于上下文的属性.

我使用的是Tomcat 5.5版.

net*_*eff 28

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

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

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

System.getProperty("SMTP_PASSWORD");
Run Code Online (Sandbox Code Playgroud)

将返回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");
Run Code Online (Sandbox Code Playgroud)

警告:我实际上没有尝试过上面的例子.但我已经尝试<env-entry>使用System.getProperty(),这肯定不起作用.

  • 当他要求更简洁的方法时,我将其解释为意味着不使用系统属性的建议.我不打算使用我的答案:System.getProperty("SMTP_PASSWORD") (2认同)

cli*_*ers 13

(更新:如果我可以删除这个答案,我会,虽然它被接受,但我不能.我正在更新说明以提供更好的指导,并阻止人们使用我在原始答案中概述的不良做法).

您可以通过上下文或环境参数指定这些参数,例如在context.xml中.请参阅此页面上标题为"上下文参数"和"环境条目"的部分:

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

正如@netjeff所指出的,这些值将通过Context.lookup(String)方法提供,而不是作为System参数提供.

做指定这些值的另一种方法是定义你要部署的Web应用程序的web.xml文件内变量(见下文).正如@Roberto Lo Giacco指出的那样,这通常被认为是一种不好的做法,因为部署的工件不应该是特定于环境的.但是,如果您真的想要这样做,下面是配置代码段:

<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>
Run Code Online (Sandbox Code Playgroud)

  • 仅供参考,如下面的答案中所述,<env-entry>值不会出现在System.getProperty()中. (2认同)

Ola*_*ock 13

通常,您不应该依赖系统属性来配置Web应用程序 - 它们可能用于配置容器(例如Tomcat),但不能用于在tomcat中运行的应用程序.

cliff.meyers已经提到了你应该用于web应用的方式.这是标准方式,也适合您通过context.xml或server.xml进行配置的问题.

也就是说,如果你真的需要tomcat中的系统属性或其他jvm选项(如max memory settings),你应该创建一个名为"bin/setenv.sh"或"bin/setenv.bat"的文件.这些文件不存在于您下载的标准存档中,但如果存在,则在启动期间执行内容(如果通过startup.sh/startup.bat启动tomcat).这是将您自己的设置与标准tomcat设置分开的一种很好的方法,使更新变得更加容易.无需调整startup.sh或catalina.sh.

(如果您将tomcat作为windows servive执行,则通常使用tomcat5w.exe,tomcat6w.exe等来配置服务的注册表设置.)

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


小智 13

也可以让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) {
    }
}
Run Code Online (Sandbox Code Playgroud)

然后把它放到你的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>
Run Code Online (Sandbox Code Playgroud)

它对我有用.


ger*_*tan 7

在tomcat配置上设置系统属性的替代方法是使用CATALINA_OPTS环境变量


use*_*141 6

这个问题在Apache wiki中得到了解决.

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

答:不可以.如果您可以编辑Tomcat的启动脚本(或者更好地创建setenv.sh文件),您可以向Java添加"-D"选项.但是,Java中没有办法为同一JVM中的不同类提供不同的系统属性值.还有一些其他可用的方法,比如使用ServletContext.getContextPath()来获取Web应用程序的上下文名称并相应地定位一些资源,或者在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