Где / как настроить конфигурационные ресурсы для файлов Tomcat .war

У меня есть исходное дерево для файла.war, которое мне нужно изменить, чтобы я мог добавить некоторую информацию о конфигурации конкретного приложения (в данном случае строку подключения jdbc, но у меня могут быть другие ресурсы, подобные свойствам). Каковы оптимальные методы для размещения информации о конфигурации и доступа к ней из сервлета?

Я предполагаю, что этот справочник по настройке Tomcat как-то связан с этим, но мои глаза закрываются, когда я пытаюсь его прочитать.

4 ответа

Решение

Для конкретного случая строки соединения JDBC я бы рекомендовал вместо этого использовать пул соединений, управляемый Tomcat. Вы можете узнать больше об этом здесь: http://tomcat.apache.org/tomcat-5.5-doc/jndi-datasource-examples-howto.html

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

Для настройки веб-приложения вы можете разместить конфигурацию в пути к классам. Затем вы можете получить к нему из вашего приложения с помощью getResourceAsStream или, если вы предпочитаете Spring:

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
  <property name="locations">
    <list>
      <value>classpath:my-config.properties</value>
    </list>
  </property>
</bean>

Есть несколько мест, где вы можете поместить свойства в путь к классам в Tomcat. по порядку:

/WEB-INF/classes of your web application 
/WEB-INF/lib/*. jar of your web application 
$CATALINA_HOME/common/classes 
$CATALINA_HOME/common/endorsed/*.jar 
$CATALINA_HOME/common/i18n/*.jar 
$CATALINA_HOME/common/lib / *. jar 
$CATALINA_BASE/shared/classes 
$CATALINA_BASE/shared/lib/*.jar  

Например, если вы поместите my-config.properties как в файл.jar, так и в классы WEB-INF/, будет использоваться файл из классов WEB-INF/. Вы можете использовать этот механизм по умолчанию для тестирования конфигурации и переопределения конфигурации prod на серверах prod.

Вы можете добавить путь к файлам свойств в вашем CATALINA_HOME/conf/catalina.properties в "общем" загрузчике классов common.loader.

Хм. Похоже, что самый простой способ получить то, что я хочу на стороне приложения - это использовать Servlet.getServletConfig().getInitParameter(parameterName) например, getInitParameter("myApp.connectionString");

Но я не знаю, где это установить. Документы Tomcat рассказывают о различных изменениях context.xml, но я хочу убедиться, что этот параметр влияет только на мой сервлет, а не на другие. Я также не хочу размещать его в моем файле.war, чтобы я мог сохранить этот параметр независимым от приложений (например, если я устанавливаю обновление).


Обновление: я понял, что параметры ключа / значения, доступные ServletContext.getInitParameter(), идут сюда (или могут идти сюда) в ${CATALINA_HOME}/conf/server.xml:

<Server port=... >
    ...
  <Service name="Catalina" ...>
    <Engine name="Catalina" ...>
      ...
      <Host name="localhost" ...>
        <Context path="/myWarFile">
          <Parameter name="foo" value="123" />
          <Parameter name="bar" value="456" />
           ...
        </Context>
      </Host>
    </Engine>
  </Service>
</Server>

Это устанавливает два параметра: "foo" = "123", "bar" = "456" для сервлета myWarFile.war (или, точнее, с URL-путем /myWarFile) и я могу получить их в Java с Servlet.getServletConfig().getInitParameter("foo") или же Servlet.getServletConfig().getInitParameter("bar"),

Я также посмотрел на запись server.xml в JIRA (и то, что они говорят вам установить для MySQL), они используют Resource а не Parameter Не совсем уверен в тонкостях этого, но кажется, что это может быть более подходящим методом.

<Server port=... >
  <Service name="Catalina" ...>
    <Engine name="Catalina" ...>
      <Host name="localhost" ...>
        <Context path="/jira" docBase="${catalina.home}/atlassian-jira" 
            reloadable="false">
          <Resource name="jdbc/JiraDS" auth="Container" type="javax.sql.DataSource"
            username="jirauser"
            password="..."
            driverClassName="com.mysql.jdbc.Driver"
            url="jdbc:mysql://localhost/jiradb1?autoReconnect=true&amp;useUnicode=true&amp;characterEncoding=UTF8"
            maxActive="20"
            validationQuery="select 1"
          />
        </Context>
      </Host>
    </Engine>
  </Service>
</Server>
Другие вопросы по тегам