Как я могу указать свойства системы в конфигурации Tomcat при запуске?


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

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

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

8 72

8 ответов:

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

вы можете указать эти параметры через контекст или параметры среды, например, в контексте.XML. См. разделы "параметры контекста "и" записи среды " на этом страница:

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

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

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

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

согласно Tomcat 6.0 docs <env-entry> это для JNDI. Значит, это не будет иметь никакого эффекта на System.getProperty().

С <env-entry> С скалы.Мейерспример, следующий код

System.getProperty("SMTP_PASSWORD");

вернет null, а не значение "abc123ftw".

по Tomcat 6 docs, чтобы использовать <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> С системой.getProperty (), и это определенно не работает.

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

скалы.Мейерс уже упоминал, как вы должны использовать для вашего веб-приложения. Это стандартный способ, который также соответствует вашему вопросу о настройке через контекст.XML или сервер.значит xml.

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

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

EDIT: кроме того, еще одна возможность-пойти на ресурсы 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) {
    }
}

а затем поместите это в свою сеть.xml (должен быть возможен для контекста.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 wiki.

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

Ответ: Нет. Если вы можете редактировать сценарии запуска Tomcat (или лучше создать setenv.sh file), вы можете добавить параметры "-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

вы можете добавить необходимые свойства в на

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

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

использовать их как показано ниже:

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

вы должны 10 как выходной.