2009-10-05 8 views
7

Ho un albero dei sorgenti per un file .war che devo modificare in modo da poter aggiungere alcune informazioni di configurazione specifiche dell'applicazione (in questo caso una stringa di connessione jdbc, ma potrei avere altre risorse simili alle proprietà). Quali sono le migliori pratiche su dove inserire le informazioni di configurazione e come accedervi dall'interno del Servlet?dove/come configurare le risorse di configurazione per i file .tar di Tomcat

Immagino che questo Tomcat configuration reference abbia qualcosa a che fare con esso, ma i miei occhi si velano quando cerco di leggerlo.

risposta

4

Per il caso specifico di una stringa di connessione JDBC, si consiglia di utilizzare invece un pool di connessioni gestito da Tomcat. Puoi leggere ulteriori informazioni su come fare questo qui: http://tomcat.apache.org/tomcat-5.5-doc/jndi-datasource-examples-howto.html

È più lavoro, ma penso che a lungo termine ti servirà meglio.

+0

grazie ...probabilmente hai ragione sul lungo periodo, ma questa è probabilmente l'unica app Tomcat su cui lavorerò per un lungo periodo di tempo + Non ho troppo tempo libero per capire come modificare la mia applicazione. I documenti di apache non sono molto chiari. –

+0

questo ha un po 'più senso ora dopo aver passato il tempo a tirare fuori i miei capelli (ahimè ...) e dopo aver guardato il server.xml JIRA. Come posso accedere a DataSource dalla mia app Java, però? La pagina di esempio fornisce un esempio di JSP ma non di codice Java. –

+0

Includono un paio di esempi più in basso (ad esempio nella sezione PostgreSQL, passaggio 4). –

5

Per la configurazione di app Web è possibile posizionare la configurazione sul classpath da qualche parte. Allora si può ottenere ad esso dalla vostra applicazione con getResourceAsStream o se preferite Primavera:

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

Ci sono un certo numero di posti si può mettere le proprietà sul classpath in Tomcat. al fine esamina:

/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 

Ad esempio, se si mette my-config.properties sia in un file .jar e in WEB-INF/classes quello in WEB-INF/classes verrà utilizzato. È possibile utilizzare questo meccanismo come predefinito per testare config e sovrascrivere prod config sui server prod.

+0

E il contrario? Se voglio avere un file di proprietà all'interno dell'applicazione web nel caso in cui Tomcat non possa essere trovato. C'è un modo per farlo? – enkara

+0

Non sono WEB_INF/classi all'interno della tua applicazione web? – leonm

1

Hmm. Sembra che il percorso più semplice per ottenere ciò che voglio dal lato Java dell'applicazione sia quello di utilizzare Servlet.getServletConfig().getInitParameter(parameterName) ad es. getInitParameter ("myApp.connectionString");

Ma non so dove impostare questo. Il Tomcat docs parla di varie permutazioni di context.xml ma voglio assicurarmi che questo parametro abbia effetto solo sul mio servlet e non su altri. Inoltre, non voglio trovarlo all'interno del mio file .war in modo da poter mantenere questo parametro indipendente dalle applicazioni (ad esempio se installo un aggiornamento).


Aggiornamento: ho capito, parametri chiave/valore accessibili da ServletContext.getInitParameter() andare qui (o può andare qui) in $ {} 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> 

Questo imposta due parametri, "foo" = "123", "bar" = "456" per il servlet myWarFile.war (o più esattamente con il percorso URL /myWarFile) e posso ottenerli in Java con Servlet.getServletConfig().getInitParameter("foo") o Servlet.getServletConfig().getInitParameter("bar").

ho visto anche l'ingresso server.xml di JIRA (e what they tell you to set it to for MySQL), usano un Resource piuttosto che un Parameter, non del tutto sicuro delle sottigliezze di questo, ma sembra che potrebbe essere il metodo più appropriato.

<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

Questi parametri sono configurati all'interno della tag servlet del file web.xml, utilizzando: init-param, param-name e param-value. http://www.orionserver.com/docs/web.xml.html – rodrigoap

+1

* quale * file web.xml? quello nel mio file .war o in $ {CATALINA_HOME}/conf? Se il primo, ho bisogno di non farlo, se quest'ultimo non capisco la sintassi appropriata. –

1

è possibile aggiungere il percorso dei file di proprietà nel vostro CATALINA_HOME/conf/catalina.properties nel classloader "comune" common.loader.

Problemi correlati