2011-02-03 9 views
21

Quiero desplegar una guerra y la guerra debe ir a buscar algunas propiedades de fuera de la guerra (que permite decir donde el archivo .war es, ese mismo directorio.)configuration.properties hacen referencia fuera de la .war

en el Actualmente esta es la mejor solución que he encontrado:

<context:property-placeholder location="file:${user.home}/configuration.properties" ignore-unresolvable="true"/> 

pero esta solución me obliga a mantenerlo siempre en el directorio principal. Quiero que esté en el directorio de webapps de tomcat donde implemente mi .war. Solo busco una solución que involucre un camino absoluto. si la ruta relativa es absolutamente imposible, entonces consideraré una ruta absoluta.

gracias de antemano.

+0

Usted escribió: "Sólo estoy buscando una solución que implica ruta absoluta" pero supongo que quería decir el opuesto. –

+0

no, no lo hice. mira el camino que usaste, no es absoluto. El tipo de variables user.home puede ser cualquier cosa. – Ikthiander

+0

¿Puedo preguntar * por qué * quiere su configuración fuera del contexto de la aplicación web? ¿Es porque quieres compartir la configuración con otras aplicaciones web? Si es así, hay mejores formas de hacerlo. – Qwerky

Respuesta

16

aquí es una solución:

<context:property-placeholder 
    location="file:${catalina.home}/webapps/datasource.properties" 
    ignore-unresolvable="true"/> 

que me haga saber si hay algo mejor, por ejemplo si puedo deshacerme de referencia catalina casa y que sea una cuestión más general de alguna manera.

+0

Creo que esta es la mejor manera, pero es borking mi IDE de elección intellij http://stackoverflow.com/q/13606328/106261 – NimChimpsky

0

Puede colocar el archivo de propiedades en el classpath y simplemente especificar el nombre del archivo de propiedades. A través del código de java, puede hacerlo like this

Supongo que la primavera también debe verificar el archivo de propiedades en el classpath. Puede tratar de poner el archivo de propiedades en el classpath y mencionar solo el nombre del archivo.

+0

gracias por su comentario. la intención no es utilizar tales códigos ya que estamos usando la primavera, y el próximo paso debe ser mínimo. – Ikthiander

3

Una solución que puedo ofrecer es usar la propiedad del sistema para pasar la ruta al archivo de configuración.

Hay 2 niveles de propiedades:

  • propiedades del sistema Java enviados mediante interruptor -D para JVM y extraídos por System.getProperty()
  • variables de entorno del sistema operativo que se definen en el nivel de sistema operativo y puede acceder utilizando System.getenv()
+0

gracias AlexR, pero por favor mira una de las posibles soluciones que he escrito sin involucrar a Java. Estaré encantado de usar jndi, el uso de códigos Java sería lo último que se puede hacer. – Ikthiander

1

Paso-1: Definición de las propiedades:

<util:properties id="myProperties" location="file:some/Absolute/path" />

Paso-2: Úselo en su aplicación. Ejemplo:

(1) public ModelAndView doWhatever(@Value("#{myProperties['some.outside.property']}") String whatever) { ... }

O (2) Properties props = appContext.getBean("myProperties", Properties.class);

3

Todo un poco tarde a la fiesta, pero pensé que había puesto una respuesta porque esta pregunta surgió primero en Google para mí No estoy seguro si esto trabajó en el momento en que se hizo la pregunta, pero a partir de la primavera 3,1, se puede hacer esto para utilizar una ruta absoluta:

<context:property-placeholder location="file:///etc/myApp/myApp.conf"/> 

Tenga en cuenta que hay tres delanteros-barras. Los primeros dos son para el protocolo: "file: //".

0

Puede definir cualquier variable como parámetro de contexto en Tomcat's context.xml y usarla en applicationContext.xml dentro de war.

Por ejemplo, context.xml:

<Context> 
    <Parameter name="configlocation" value="/etc/application/my.properties" override="false"/> 
</Context> 

applicationContext.xml:

<beans ...> 
    <context:property-placeholder location="file:${configlocation}" ... /> 
</beans> 
Cuestiones relacionadas