Як я можу вказати властивості системи в конфігурації Tomcat під час запуску?


74

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

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

Я використовую Tomcat версії 5.5.


11
додати "властивість = значення" як чистий текст до catalina.properties. (в Linux це в / etc / tomcat)
VasiliNovikov

Відповіді:


13

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

Ви можете вказати ці параметри через контекст або параметри середовища, наприклад у 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>

Я не зміг перевірити свій web.xml, використовуючи вищезазначене. Однак перемикання порядку записів env-entry-value та env-entry-type працювало.
Catchwa 03.03.10

Гаразд, DTD або XSD, мабуть, визначає точний порядок для цих елементів. Відповідно я оновив свою відповідь. Дякую.
cliff.meyers

2
FYI, як зазначено у моїй відповіді нижче, значення <env-entry> не відображатимуться у System.getProperty ().
netjeff

1
Будь ласка, НЕ застосовуйте цю пораду до файлу web.xml: ваше розгортання буде залежати від середовища, і, таким чином, ви реалізуєте анти-шаблон. Контекст і параметри середовища є вдалим місцем для цих налаштувань.
Роберто Ло Джакко

Це чудово, якщо вам подобаються жорсткі програми, які змінюються в будь-якому середовищі, наприклад у вашому каталозі журналу. ;-) Він також не відповідає на запитання, як його задали.
user447607

29

Оригінальна відповідь 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 (), і це , безумовно , не працює.


2
Коли він попросив більш чистого способу зробити це, я витлумачив, що це означає пропозиції щодо не використання властивостей системи. Я не збирався працювати зі своєю відповіддю: System.getProperty ("SMTP_PASSWORD")
cliff.meyers

1
Так, зараз я бачу, до чого ви прагнули. У цьому випадку моя відповідь "уточнює", що якби Маркус використовував <env-entry> у context.xml, то йому довелося б використовувати трохи більш складний контекстний API (як у моєму прикладі), а не однолінійну систему .getProperty (). Сподіваюся, Маркус знайшов щось, що працювало на його потреби.
netjeff

13

Як правило, ви не повинні покладатися на властивості системи для налаштування веб-додатка - вони можуть використовуватися для налаштування контейнера (наприклад, 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 .


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>

У мене це спрацювало.


8

Альтернативою встановленню системної властивості в конфігурації tomcat є використання змінної середовища CATALINA_OPTS


6

Це питання розглядається у вікі Apache.

Питання: "Чи можу я встановити властивості системи Java по-різному для кожного веб-додатка?"

Відповідь: Ні. Якщо ви можете редагувати сценарії запуску Tomcat (або краще створити файл setenv.sh), ви можете додати в Java параметри "-D". Але в 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


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як вихід.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.