我有一个.war文件的源代码树,我需要修改它,以便我可以添加一些特定于应用程序的配置信息(在这种情况下是一个jdbc连接字符串,但我可能有其他类似属性的资源)。有关配置信息的位置以及如何从Servlet中访问它的最佳实践是什么?
我猜这个Tomcat configuration reference与它有关,但当我尝试阅读它时,我的眼睛茫然。
答案 0 :(得分:5)
对于Web应用程序配置,您可以将配置放在类路径的某个位置。然后,您可以使用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 / classes中,则将使用WEB-INF / classes中的一个。您可以使用此机制来默认测试配置并覆盖prod服务器上的prod配置。
答案 1 :(得分:4)
对于JDBC连接字符串的特定情况,我建议使用Tomcat管理的连接池。您可以在此处阅读更多相关信息: http://tomcat.apache.org/tomcat-5.5-doc/jndi-datasource-examples-howto.html
这是更多的工作,但我认为从长远来看它会更好地为你服务。
答案 2 :(得分:1)
嗯。看起来在应用程序的Java端获得我想要的最简单的途径是使用Servlet.getServletConfig().
getInitParameter(parameterName)
,例如的getInitParameter( “myApp.connectionString”);
但我不知道在哪里设置它。 Tomcat docs讨论了context.xml的各种排列,但我想确保这个参数只影响我的servlet而不影响其他任何。我也不想在我的.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>
这为servlet myWarFile.war设置了两个参数,“foo”=“123”,“bar”=“456”(或者更准确地说是URL路径/myWarFile
),我可以在Java Servlet.getServletConfig().getInitParameter("foo")
或Servlet.getServletConfig().getInitParameter("bar")
。
我还查看了JIRA的server.xml条目(和what they tell you to set it to for 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>
答案 3 :(得分:1)
您可以在“常用”类加载器 common.loader 中的CATALINA_HOME/conf/catalina.properties
中添加属性文件的路径。