Как указать свойства системы в конфигурации Tomcat при запуске?
Я понимаю, что могу указать системные свойства Tomcat, передавая аргументы с параметром-D, например" - Dmy.реквизит=значение".
Мне интересно, есть ли более чистый способ сделать это, указав значения свойств в контексте.xml-файл или другой файл конфигурации tomcat. Я хотел бы сделать это, потому что, во-первых, легче отслеживать мои свойства, а во-вторых, у меня есть несколько контекстов, и я не знаю, как бы я укажите контекстно-специфические свойства с помощью параметра-D.
Я использую Tomcat версии 5.5.
8 ответов
(Update: если бы я мог удалить этот ответ, я бы, хотя, поскольку он принят, я не могу. Я обновляю описание, чтобы обеспечить лучшее руководство и препятствовать людям использовать плохую практику, которую я изложил в первоначальном ответе).
вы можете указать эти параметры через контекст или параметры среды, например в контексте.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>
скалы.Мейерс!--11-->оригинальный ответ, который предложил использовать <env-entry>
не поможет при использовании только системы.getProperty ()
согласно документам Tomcat 6.0 <env-entry>
для JNDI. Значит, это не будет иметь никакого эффекта на System.getProperty()
.
С <env-entry>
С скалы.Мейерс!--11-->пример, следующий код
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");
предостережение: я на самом деле не пробовал пример выше. Но Я ... --26-->есть пробовал <env-entry>
С системой.getProperty (), и это определенно не работает.
обычно вы не должны полагаться на системные свойства для настройки webapp - они могут использоваться для настройки контейнера (например, Tomcat), но не приложения, работающего внутри tomcat.
скалы.Мейерс уже упоминал, как вы должны использовать для вашего веб-приложения. Это стандартный способ, который также соответствует вашему вопросу о настройке через контекст.XML или сервер.в XML означает.
тем не менее, если вам действительно нужны системные свойства или другие jvm параметры (например, max memory settings) в tomcat, вы должны создать файл с именем "bin/setenv.sh или" bin / setenv.летучая мышь." Эти файлы не существуют в стандартном архиве, который вы загружаете, но если они присутствуют, содержимое выполняется во время запуска (если вы запускаете tomcat через startup.sh / startup.bat). Это хороший способ отделить ваши собственные настройки от стандартных настроек tomcat и делает обновления намного проще. Нет необходимости настраивать startup.sh или catalina.sh.
(Если вы выполняете tomcat как Windows servive, вы обычно используете tomcat5w.exe, tomcat6w.exe etc. настройка параметров реестра для службы.)
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.
вопрос: "Могу ли я установить системные свойства 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
Если вы хотите определить переменную среды в своей контекстной базе на документации, которую вы подковали, определите их, как показано ниже
<Context ...>
...
<Environment name="maxExemptions" value="10"
type="java.lang.Integer" override="false"/>
...
</Context>
использовать их как показано ниже:
((Context)new InitialContext().lookup("java:comp/env")).lookup("maxExemptions")
вы должны 10
как выходной.