Как я могу указать системные свойства в конфигурации Tomcat при запуске? - PullRequest
73 голосов
/ 16 декабря 2008

Я понимаю, что могу указать системные свойства Tomcat, передав аргументы с параметром -D, например " -Dmy.prop = value ".

Мне интересно, есть ли более чистый способ сделать это, указав значения свойств в файле context.xml или в другом файле конфигурации tomcat. Я хотел бы сделать это, потому что, во-первых, мне легче отслеживать мои свойства, а во-вторых, у меня запущено несколько контекстов, и я не знаю, как бы я определял контекстно-зависимые свойства через параметр -D.

Я использую Tomcat версии 5.5.

Ответы [ 8 ]

28 голосов
/ 27 января 2009

cliff.meyers оригинальный ответ, в котором предлагается использовать <env-entry>, не поможет при использовании только System.getProperty ()

Согласно документам Tomcat 6.0 <env-entry> - для JNDI . Так что это означает, что это не окажет никакого влияния на System.getProperty().

С примером <env-entry> из cliff.meyers следующий код

System.getProperty("SMTP_PASSWORD");

вернет ноль, а не значение "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 (), и это определенно не работает.

13 голосов
/ 25 февраля 2010

Также возможно позволить 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>

У меня это сработало.

13 голосов
/ 28 декабря 2008

Обычно для настройки веб-приложения не следует полагаться на системные свойства - они могут использоваться для настройки контейнера (например, Tomcat), но не приложения, работающего внутри tomcat.

cliff.meyers уже упомянул способ, которым вы должны использовать свое веб-приложение. Это стандартный способ, который также подходит для вашего вопроса о возможности настройки с помощью context.xml или server.xml.

Тем не менее, если вам действительно нужны системные свойства или другие параметры jvm (например, максимальные настройки памяти) в tomcat, вы должны создать файл с именем "bin / setenv.sh" или "bin / setenv.bat". Эти файлы не существуют в стандартном архиве, который вы загружаете, но, если они присутствуют, содержимое выполняется во время запуска (если вы запускаете tomcat через startup.sh/startup.bat). Это хороший способ отделить ваши собственные настройки от стандартных настроек tomcat и значительно упрощает обновления. Не нужно настраивать startup.sh или catalina.sh.

(Если вы запускаете tomcat в качестве службы Windows, вы обычно используете tomcat5w.exe, tomcat6w.exe и т. Д. Для настройки параметров реестра для службы.)

РЕДАКТИРОВАТЬ: Кроме того, другая возможность заключается в JNDI Resources .

13 голосов
/ 18 декабря 2008

(Обновление: если бы я мог удалить этот ответ, я бы сделал это, хотя, поскольку он принят, я не могу. Я обновляю описание, чтобы дать лучшее руководство и отговорить людей от использования плохой практики, которую я изложил в первоначальном ответе) .

Вы можете указать эти параметры через параметры контекста или среды, например, в context.xml. См. Разделы «Параметры контекста» и «Записи среды» на этой странице:

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

Как указывает @netjeff, эти значения будут доступны через метод Context.lookup (String), а не как системные параметры.

Другой способ указать эти значения - определить переменные внутри файла 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>
7 голосов
/ 26 сентября 2012

Альтернативой настройке системного свойства в конфигурации tomcat является использование переменной среды CATALINA_OPTS

6 голосов
/ 20 июля 2015

Этот вопрос рассматривается в вики Apache.

Вопрос: «Могу ли я по-разному устанавливать свойства системы Java для каждого веб-приложения?»

Ответ: Нет. Если вы можете редактировать сценарии запуска Tomcat (или лучше создать файл setenv.sh), вы можете добавить опции «-D» в Java. Но в Java нет способа иметь разные значения системных свойств для разных классов в одной и той же JVM. Существуют и другие доступные методы, такие как использование ServletContext.getContextPath () для получения имени контекста вашего веб-приложения и соответствующего поиска некоторых ресурсов, или для определения элементов в файле 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

2 голосов
/ 10 ноября 2017

Вы можете добавить необходимые свойства в файл 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 голосов
/ 24 апреля 2018

Если вы хотите определить переменную окружения в своей контекстной базе на основе документации, вы должны определить их, как показано ниже

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

Также используйте их, как показано ниже:

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

Вы должны получить 10 в качестве вывода.

...