【问题标题】:where/how to setup configuration resources for Tomcat .war files在哪里/如何为 Tomcat .war 文件设置配置资源
【发布时间】:2010-05-25 20:00:15
【问题描述】:

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

我猜这Tomcat configuration reference 与它有关,但是当我尝试阅读它时,我的眼睛呆滞了。

【问题讨论】:

    标签: java configuration tomcat


    【解决方案1】:

    对于 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 配置。

    【讨论】:

    • 相反呢?如果我想在 Web 应用程序中有一个属性文件,以防找不到 Tomcat。有没有办法做到这一点?
    • Web 应用程序中没有WEB_INF/classes 吗?
    【解决方案2】:

    对于 JDBC 连接字符串的特定情况,我建议改用 Tomcat 管理的连接池。您可以在此处阅读有关执行此操作的更多信息: http://tomcat.apache.org/tomcat-5.5-doc/jndi-datasource-examples-howto.html

    这是更多的工作,但我认为从长远来看它会更好地为您服务。

    【讨论】:

    • 谢谢...从长远来看,您可能是对的,但这可能是我将长期从事的唯一 Tomcat 应用程序 + 我没有太多空闲时间弄清楚如何调整我的应用程序。 apache 文档不是很清楚。
    • 在花时间拔掉我的头发(唉...)并查看 JIRA server.xml 之后,这现在变得更有意义了。但是,如何从我的 Java 应用程序中访问 DataSource?示例页面提供了一个 JSP 示例,但没有提供 Java 代码示例。
    • 它们包括几个更下方的示例(例如,在 PostgreSQL 部分的第 4 步中)。
    • 这个问题还有一个例子:stackoverflow.com/questions/1119817/…
    • 这是一个仅链接的答案。您能否通过链接来源的摘录来丰富它?
    【解决方案3】:

    嗯。看起来在应用程序的 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>
    

    【讨论】:

    • 这些参数在 web.xml 文件的 servlet 标记内配置,使用:init-param、param-name 和 param-value。 orionserver.com/docs/web.xml.html
    • 哪个 web.xml 文件?我的 .war 文件或 ${CATALINA_HOME}/conf 中的那个?如果是前者,我不需要这样做,如果是后者,我不理解适当的语法。
    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-10-13
      • 2020-01-23
      • 2014-08-15
      • 1970-01-01
      • 2019-07-01
      • 1970-01-01
      • 2017-01-20
      相关资源
      最近更新 更多