English 中文(简体)
我如何在Tomcat配置中指定系统属性来启动?
原标题:
  • 时间:2008-12-16 20:59:21
  •  标签:

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

我在想,是否可以通过在context.xml文件或其他Tomcat配置文件中指定属性值来更清晰地执行此操作。我之所以想这样做,是因为首先,更容易跟踪我的属性,其次,我有多个context在运行,我不知道如何通过-D参数指定上下文特定的属性。

我正在使用Tomcat版本5.5。

最佳回答

更新:如果我可以删除这个答案,我会的,尽管因为它已被接受,我无法删除它。我更新了描述,提供更好的指导,并阻止人们使用我在原始答案中概述的不良做法。

您可以通过上下文或环境参数来指定这些参数,例如在context.xml文件中。请参阅本页面上标题为“Context Parameters”和“Environment Entries”的部分。

将此翻译成中文:http://tomcat.apache.org/tomcat-5.5-doc/config/context.html 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>
问题回答

Cliff.meyers 原始答案建议使用 <env-entry> 在仅使用 System.getProperty() 时将无济于事。

根据Tomcat 6.0文档,<env-entry> 用于JNDI。这意味着它对 System.getProperty() 没有影响。

使用<env-entry>,来自cliff.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");

警告:我实际上没有尝试上面的示例。但是我使用System.getProperty()尝试过,那绝对不起作用。

通常情况下,您不应依赖系统属性来配置webapp - 它们可能用于配置容器(例如Tomcat),但不适用于在Tomcat内部运行的应用程序。

Cliff.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资源

也可以让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>

它对我有效。

在Tomcat配置中设置系统属性的另一种选择是使用CATALINA_OPTS环境变量。

这个问题在Apache维基上得到了解答。

问题:“我可以为每个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 http://wiki.apache.org/tomcat/HowTo#Can_I_set_Java_system_properties_differently_for_each_webapp.3F

您可以在/conf目录下的文件中添加必要的属性。

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

All system properties are available including those set using the -D syntax, those automatically made available by the JVM and those configured in the $CATALINA_BASE/conf/catalina.properties file.

如果您想根据文档在上下文中定义环境变量,则应按以下方式定义它们

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

也使用它们如下:

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

你应该得到 10 作为输出。





相关问题
热门标签