在何处/如何为Tomcat .war文件设置配置资源

时间:2009-10-05 19:32:42

标签: java configuration tomcat

我有一个.war文件的源代码树,我需要修改它,以便我可以添加一些特定于应用程序的配置信息(在这种情况下是一个jdbc连接字符串,但我可能有其他类似属性的资源)。有关配置信息的位置以及如何从Servlet中访问它的最佳实践是什么?

我猜这个Tomcat configuration reference与它有关,但当我尝试阅读它时,我的眼睛茫然。

4 个答案:

答案 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&amp;useUnicode=true&amp;characterEncoding=UTF8"
            maxActive="20"
            validationQuery="select 1"
          />
        </Context>
      </Host>
    </Engine>
  </Service>
</Server>

答案 3 :(得分:1)

您可以在“常用”类加载器 common.loader 中的CATALINA_HOME/conf/catalina.properties中添加属性文件的路径。