Где / как настроить конфигурационные ресурсы для файлов 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&useUnicode=true&characterEncoding=UTF8"
maxActive="20"
validationQuery="select 1"
/>
</Context>
</Host>
</Engine>
</Service>
</Server>