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

Примечание: Неопределенная переменная

Случается, когда вы пытаетесь использовать переменную, которая ранее не была определена.

Типичным примером может быть

foreach ($items as $item) {
    // do something with item
    $counter++;
}

Если вы ранее не определяли $counter, код, указанный выше, вызывает уведомление.

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

$counter = 0;
foreach ($items as $item) {
    // do something with item
    $counter++;
}

Вопросы, относящиеся:

73
задан Brian Tompsett - 汤莱恩 31 May 2015 в 12:26
поделиться

4 ответа

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

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

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

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

Другой способ сделать определяет, что эти значения должны определить переменные в файле 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>
13
ответ дан cliff.meyers 24 November 2019 в 12:24
поделиться

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

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

С <env-entry> от [1 111] пример 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 (), и это определенно не работает.

28
ответ дан netjeff 24 November 2019 в 12:24
поделиться

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

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

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

(При казни кота как окон servive Вы обычно используете tomcat5w.exe, tomcat6w.exe и т.д. для конфигурирования настроек реестра для сервиса.)

РЕДАКТИРОВАНИЕ: Кроме того, другая возможность состоит в том, чтобы пойти для Ресурсы JNDI .

13
ответ дан cliff.meyers 24 November 2019 в 12:24
поделиться

Также возможно позволить 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
ответ дан 24 November 2019 в 12:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: