76

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

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

我正在使用 Tomcat 5.5 版。

4

8 回答 8

29

当仅使用System.getProperty<env-entry> ()

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

<env-entry>来自悬崖.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(),但这绝对行不通。

于 2009-01-26T23:01:09.163 回答
14

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

您可以通过上下文或环境参数指定这些参数,例如在 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>
于 2008-12-18T03:22:56.767 回答
13

通常,您不应该依赖系统属性来配置 webapp - 它们可能用于配置容器(例如 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 servive执行,通常使用tomcat5w.exe、tomcat6w.exe等配置服务的注册表设置。)

编辑:另外,另一种可能性是选择JNDI Resources

于 2008-12-28T14:49:59.147 回答
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) {
    }
}

然后把它放到你的 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>

它对我有用。

于 2010-02-25T15:49:48.837 回答
8

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

于 2012-09-25T23:27:20.043 回答
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

于 2015-07-20T16:49:23.250 回答
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 文件中配置的属性。

于 2017-11-09T21:13:25.423 回答
0

如果您想根据文档在上下文中定义环境变量,您应该将它们定义如下

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

还可以如下使用它们:

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

你应该得到10作为输出。

于 2018-04-24T08:21:53.553 回答