2010-06-04 7 views
5

Tengo diferentes archivos XML en mi carpeta 'src/main/recources', y me gustaría leerlos desde mi aplicación web.Almacenar archivos xml en la carpeta de recursos (WAR), leer desde el código

File f = new File("file1.xml"); 
f.getAbsolutePath(); 

El código se invoca dentro de un servicio Web, y esto imprime 'C: \ Users \ Administrator' cuando miro dentro del Tomcat de servidor de salida. Mi solución actual es colocar los documentos 'file1.xml' fuera del WAR, en la carpeta 'C: \', pero de esta forma mi WAR no es transferible.

También he intentado

<bean name="webService"> 
     <property name="document"> 
     <value>classpath:file1.xml</value> 
     </property> 
    </bean> 

Pero eso se limita a imprimir la "ruta de clases: file.xml" sin analizarlo.

Saludos, Pete

Respuesta

5

Si está utilizando el paquete maven2 war estándar, su archivo1.xml se copia en el directorio WEB-INF/classes dentro de su warfile.

Puede acceder a este archivo a través del classpath.

URL resourceUrl = URL.class.getResource("/WEB-INF/classes/file1.xml"); 
File resourceFile = new File(resourceUrl.toURI()); 
+2

Ahh funciona, tuve que modificar un poco la primera línea: URL resourceUrl = Thread.currentThread(). GetContextClassLoader(). GetResource ("file1.xml"); File1.xml tiene que estar en la carpeta de recursos, por supuesto. ¡Muchas gracias! – JavaPete

+0

¿Pero por qué necesita ir a través de currentThread(). GetContextClassLoader()? ¿Hay algún tipo de restricción de seguridad en su entorno o me estoy perdiendo algo? ¿Está construyendo su aplicación web utilizando el plugin Maven War estándar o mediante un ensamblaje o de otro modo? –

0

Si coloca el archivo en un directorio debajo WEB-INF (o dentro de la propia WEB-INF), entonces se puede leer mediante el ServletContext 's getResourceAsStream método:

try { 
    InputStream is = context.getResourceAsStream("/WEB-INF/file1.xml"); 
    ... 
} catch (IOException e) { 
    ... 
} 
+0

No tengo un objeto ServletContext, ya que este código reside dentro de un método de servicio web (Spring-WS). O me estoy perdiendo el punto? – JavaPete

0

Puede poner la información de ruta en el archivo de propiedades que se encuentra en la ruta/WEB-INF/classes y cargar esta información en la aplicación en tiempo de ejecución.

Para tener un valor diferente para esta propiedad de ruta puede usar la opción de perfiles maven o cualquier otra herramienta de compilación, de modo que diferentes entornos den como resultado que el archivo WAR tenga el valor de propiedades correcto para la ruta adecuada para ese entorno.

+0

Sí, pero quiero evitar hacer eso porque una ruta relativa al archivo no me obligaría a tener diferentes archivos de configuración. Pero usaré esta solución si no consigo hacer nada más, ¡gracias! – JavaPete

Cuestiones relacionadas