Pregunta

Hemos estado utilizando System.getProperties ( "user.dir") para obtener la ubicación de un archivo de propiedades. Ahora que se ha desplegado en Tomcat (a través de servlet), la llamada al sistema está dando la ubicación como Tomcat y no en el lugar en el que se encuentran los archivos de propiedades.

¿Cómo podemos llamar a un archivo dinámicamente las propiedades?

Teniendo en cuenta:

  • Tomcat no es la única forma en que la aplicación serán desplegados
  • No tenemos ningún control sobre dónde la aplicación puede ser colocado.
  • Las rutas relativas no funcionarán como que Vista está siendo utilizado y se rompe Vista rutas relativas.
  • Esto debe trabajar en todos los sistemas operativos, incluyendo (pero no limitados a) Linux, XP y Vista.
  • Editar he dado a entender esto, pero en caso de que yo no era lo suficientemente claro, no tengo manera de conocer la cadena de ruta.
¿Fue útil?

Solución

Debe tener una forma de conocer la ruta del archivo de propiedades que luego se puede envolver en un archivo y pasar al método load () de sus propiedades del objeto.

Si se ejecuta dentro de un servicio Tomcat no se está ejecutando como el usuario que lo ha instalado como, por lo que no se puede derivar el directorio principal. Lo más probable es necesario codificar algo, entonces.


Edit: El archivo de propiedades es relativa a la aplicación. Ver http://www.exampledepot.com/egs/java.lang/ClassOrigin .html para un ejemplo de cómo llegar al nombre del archivo para el código de bytes para una clase dada. Usted debe ser capaz de continuar a partir de ahí.

Class cls = this.getClass();
ProtectionDomain pDomain = cls.getProtectionDomain();
CodeSource cSource = pDomain.getCodeSource();
URL loc = cSource.getLocation();  // file:/c:/almanac14/examples/

Debe tener en cuenta que algunos administradores de seguridad no permiten esto.

Otros consejos

Tome un vistazo a la ServletContext getResource y métodos getResourceAsStream .

Creo ClassName.class.getResourceAsStream () funcionará para usted. Los comentarios sobre este punto que el método a ClassLoader.getResource () , que le indica cómo especificar un archivo en la ruta de clases.

Algo como esto debería funcionar:

InputStream foo = ClassName.class.getResourceAsStream("file.name");

Cuando file.name está en la base de la ruta de clases en alguna parte. Si file.name está en el paquete com.foo.bar, utilizaría "/com/foo/bar/file.name"

Si he entendido la pregunta correclty, otra alternativa podría ser una llamada ServletContext.getRealPath() en un JSP o un archivo estático en su aplicación y obtener la ruta del resultado.

Esto implica webapp desplegado como "ampliado" - es decir, no como un archivo comprimido guerra - pero eso es lo que la mayoría appservers hacer de todos modos

.

Puede colocar los archivos de propiedades en su ruta de clase y leerlos como un flujo de entrada usando algo como:

ClassName.class.getResourceAsStream (filePath + filename);

Cuando rutaArchivo es la ruta relativa del archivo desde la raíz ruta de clase y nombre de archivo es el nombre del archivo.

Si usted necesita para obtener la ruta absoluta a un archivo se lee como un recurso, puede hacer algo como esto:

ClassName.class.getResource (filePath + filename) .getPath ()

¿Es posible poner el archivo de configuración dentro de la ruta de clases y hacer referencia a ella a través de algo así como muelles ClassPathResource ?

Usted debe ser capaz de utilizar de esta manera:

ClassPathResource foo = new ClassPathResource("file.name");

Cuando existe file.name en algún lugar de la ruta de clase en el nivel más bajo, tales como:

  • / webapps / WEB-INF / classes /
  • la base de uno de sus archivos jar

Otro enfoque puede ser para pasar el valor de la variable a la JVM con -D parámetro. De esa manera usted puede atar su código con el mismo nombre de la variable y luego pasar valores diferentes en el momento de la puesta en marcha. No he probado esto, pero estoy pensando que debería funcionar para una aplicación desplegada en Tomcat así, si modifica la escritura startCatalina pasar parámetro -D para JVM

Se puede almacenar la ubicación de archivo de propiedades de JNDI?

Esto debería ser portable a través de Tomcat y para servidores de aplicaciones Java EE.

Hemos tenido los mismos requisitos. Lo más sencillo que funcionó hasta ahora era simplemente almacenar una propiedad basedir en uno de los archivos de propiedades que ya estaban cargando. A continuación, defina un método como getExternalDocPath (camino String).

Esto nos permitió extender el docbase de Tomcat (que sólo Tomcat 7 apoyos?). En la web a alguien publicado una clase que se extiende en realidad docbase de Tomcat para permitir que varios caminos, es decir,. "Alfa; panadero; Charlie"

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top