2009-10-05 19 views
7

Tengo un árbol de fuentes para un archivo .war que necesito modificar para poder agregar alguna información de configuración específica de la aplicación (en este caso una cadena de conexión jdbc, pero puedo tener otras propiedades, como recursos). ¿Cuáles son las mejores prácticas para dónde colocar la información de configuración y cómo acceder a ella desde dentro del Servlet?dónde/cómo configurar los recursos de configuración para los archivos .war de Tomcat

Supongo que esto Tomcat configuration reference tiene algo que ver con eso, pero mis ojos se nublan cuando trato de leerlo.

Respuesta

4

Para el caso específico de una cadena de conexión JDBC, recomendaría utilizar un conjunto de conexiones gestionado por Tomcat. Puedes leer más sobre cómo hacer esto aquí: http://tomcat.apache.org/tomcat-5.5-doc/jndi-datasource-examples-howto.html

Es más trabajo, pero creo que a la larga te servirá mejor.

+0

gracias ...probablemente tengas razón a largo plazo, pero esta es probablemente la única aplicación Tomcat en la que trabajaré durante mucho tiempo + No tengo demasiado tiempo libre para descubrir cómo ajustar mi aplicación. Los documentos de apache no son muy claros. –

+0

esto tiene un poco más de sentido ahora después de pasar el tiempo tirando de mi cabello (por desgracia ...) y después de mirar el servidor JIRA.xml. Sin embargo, ¿cómo puedo acceder al DataSource desde mi aplicación Java? La página de ejemplo ofrece un ejemplo de JSP pero no de código Java. –

+0

Incluyen un par de ejemplos más abajo (por ejemplo, en la sección PostgreSQL, paso 4). –

5

Para la configuración de la aplicación web puede colocar la configuración en el classpath en alguna parte. A continuación, puede llegar a ella desde su aplicación con getResourceAsStream o si lo prefiere primavera:

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

hay una serie de lugares que puede poner las propiedades en la ruta de clase en Tomcat. con el fin de que se ve en:

/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 

Por ejemplo, si se pone my-config.properties tanto en un archivo .jar y en WEB-INF/classes el que está en WEB-INF/classes se utilizará. Puede utilizar este mecanismo para establecer de forma predeterminada la configuración de prueba y anular la configuración de prod en los servidores de prod.

+0

¿Qué pasa con lo contrario? Si quiero tener un archivo de propiedades dentro de la aplicación web, solo en caso de que no se encuentre el Tomcat. ¿Hay una manera de hacer eso? – enkara

+0

¿No hay WEB_INF/classes dentro de su aplicación web? – leonm

1

Hmm. Parece que la ruta más fácil para obtener lo que quiero en el lado Java de la aplicación es usar Servlet.getServletConfig().getInitParameter(parameterName), por ejemplo. getInitParameter ("myApp.connectionString");

Pero no sé dónde configurar esto. El Tomcat docs habla de varias permutaciones de context.xml, pero quiero asegurarme de que este parámetro solo afecte a mi servlet y no a otros. Tampoco quiero ubicarlo dentro de mi archivo .war para poder mantener este parámetro independiente de las aplicaciones (por ejemplo, si instalo una actualización).


Actualización: lo he descubierto, parámetros clave/valor accesibles por ServletContext.getInitParameter() ir aquí (o puede ir aquí) en $ {} 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> 

Esto establece dos parámetros, "foo" = "123", "bar" = "456" para el servlet myWarFile.war (o más exactamente con la ruta URL /myWarFile) y puedo obtenerlos en Java con Servlet.getServletConfig().getInitParameter("foo") o Servlet.getServletConfig().getInitParameter("bar").

también miré a la entrada server.xml de JIRA (y what they tell you to set it to for MySQL), utilizan un Resource en lugar de un Parameter, no muy seguro de las sutilezas de esto, pero parece que podría ser el método más apropiado.

<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> 
+0

Esos parámetros se configuran dentro de la etiqueta de servlet del archivo web.xml, usando: init-param, param-name y param-value. http://www.orionserver.com/docs/web.xml.html – rodrigoap

+1

* ¿qué * archivo web.xml? el que está en mi archivo .war o en $ {CATALINA_HOME}/conf? Si el primero, no debo hacer eso, si este último no entiendo la sintaxis adecuada. –

1

puede agregar la ruta de los archivos de propiedades en su CATALINA_HOME/conf/catalina.properties en el cargador de clases "común" common.loader.

Cuestiones relacionadas