Как я могу указать свойства системы в конфигурации Tomcat при запуске?
Я понимаю, что я могу указать системные свойства Tomcat, передав аргументы с параметром -D, например " -Dmy.prop = value".
Мне интересно, есть ли более чистый способ сделать это, указав значения свойства в файле context.xml или другом файле конфигурации tomcat. Я хотел бы сделать это, потому что, во-первых, легче отслеживать мои свойства, а во-вторых, я запускаю несколько контекстов, и я не знаю, как указать специфические для контекста свойства с помощью параметра -D.
Я использую Tomcat версии 5.5.
Ответы
Ответ 1
(Обновление: если бы я мог удалить этот ответ, я бы, хотя, поскольку он был принят, я не могу. Я обновляю описание, чтобы обеспечить лучшее руководство и препятствовать людям использовать плохую практику, изложенную в первоначальном ответе).
Вы можете указать эти параметры через контекст или параметры среды, например, в 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>
Ответ 2
Первоначальный ответ 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");
Предостережение. На самом деле я не попробовал приведенный выше пример. Но я имел, пробовал <env-entry>
с System.getProperty(), и это определенно не работает.
Ответ 3
Как правило, вы не должны полагаться на свойства системы для настройки webapp - они могут использоваться для настройки контейнера (например, 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 и т.д. для настройки параметров реестра для этой службы.)
EDIT: Кроме того, еще одна возможность - перейти на JNDI Resources.
Ответ 4
Также возможно, чтобы ServletContextListener установил свойства System:
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>
Это сработало для меня.
Ответ 5
Альтернативой установке системного свойства в конфигурации tomcat является использование переменной среды CATALINA_OPTS
Ответ 6
Этот вопрос рассматривается в вики-странице Apache.
Вопрос: "Могу ли я задавать свойства системы Java по-разному для каждого webapp?"
Ответ: Нет. Если вы можете редактировать сценарии запуска 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
Ответ 7
Вы можете добавить необходимые свойства в файл catalina.properties
в каталог <tomcat installation directory>/conf
.
Ссылка: https://tomcat.apache.org/tomcat-8.0-doc/config/index.html
Доступны все свойства системы, в том числе установленные с помощью -D синтаксиса, автоматически создаваемые JVM и теми настроен в файле $CATALINA_BASE/conf/catalina.properties.