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


74

我了解我可以通过传递带有-D参数的参数来指定Tomcat的系统属性,例如“ -Dmy.prop = value ”。

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

我正在使用Tomcat 5.5版。


11
将“ property = value”作为纯文本追加到catalina.properties。(在Linux中,它在/ etc / tomcat中)
VasiliNovikov 2012年

Answers:


13

(更新:如果我可以删除此答案,尽管可以接受,但我不能。我正在更新说明以提供更好的指导,并劝阻人们不要使用我在原始答案中概述的不良做法。)

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

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

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

指定这些值的另一种方法是在要部署的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>

我无法使用上述方法来验证我的web.xml。但是,切换env-entry-value和env-entry-type条目的顺序是可行的。
Catchwa

好的,DTD或XSD可能为这些元素指定了精确的顺序。我已经相应更新了我的答案。谢谢。
ceiling.meyers,2010年

2
仅供参考,正如我在下面的答案中所述,<env-entry>值不会出现在System.getProperty()中。
netjeff 2013年

1
请不要将此建议应用于web.xml文件:您的可部署对象将是特定于环境的,因此,您正在实现反模式。上下文和环境参数是这些设置的好地方。
罗伯托·罗·贾科

如果您希望对在每个环境(例如,日志目录)中发生变化的事情进行硬编码,那就非常好。;-)它也没有回答所要求的问题。
user447607 2014年

29

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

根据Tomcat 6.0,文档<env-entry>适用于JNDI。因此,这不会对产生任何影响System.getProperty()

<env-entry>from悬崖.meyers的示例为例,以下代码

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");

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


2
当他要求一种更清洁的方法时,我将其解释为建议不要使用System属性。我不打算将答案与以下系统一起使用:System.getProperty(“ SMTP_PASSWORD”)
悬崖.meyers

1
是的,我现在明白了您的目标。在这种情况下,我的答案“澄清”说,如果Markus在context.xml中使用<env-entry>,那么他将不得不使用稍微复杂一些的Context API(如我的示例),而不是单行系统.getProperty()。我希望马库斯找到适合他需要的东西。
netjeff

13

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

悬崖.meyers已经提到了您应该在Web应用程序中使用的方式。这是标准方式,也适合您通过context.xml或server.xml方式进行配置的问题。

也就是说,如果您确实需要tomcat中的系统属性或其他jvm选项(例如最大内存设置),则应该创建一个名为“ bin / setenv.sh”或“ bin / setenv.bat”的文件。这些文件在您下载的标准归档文件中不存在,但如果存在,则在启动过程中执行内容(如果您通过startup.sh/startup.bat启动tomcat)。这是将您自己的设置与标准tomcat设置分开的一种好方法,并使更新变得如此容易。无需调整startup.sh或catalina.sh。

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

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


13

也可以让ServletContextListener设置System属性:

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>

它为我工作。


8

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


6

这个问题在Apache Wiki中得到了解决。

问题:“我可以为每个Web应用程序设置不同的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


4

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

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

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


0

如果要基于文档在上下文中定义环境变量,则应按以下方式定义它们

<Context ...>
  ...
  <Environment name="maxExemptions" value="10"
         type="java.lang.Integer" override="false"/>
  ...
</Context>

也可以如下使用它们:

((Context)new InitialContext().lookup("java:comp/env")).lookup("maxExemptions")

您应该得到10输出。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.