2011-01-03 11 views
12

Necesito cargar un archivo de propiedad desde el contenedor. El jar está incluido en el archivo war. Aquí está la estructuraCómo cargar el recurso del archivo jar empaquetado en un archivo war?

ROOT.war 
    WEB-INF 
    lib 
     my.jar 

here my.jar has following structure 

my.jar 
    com 
    test 
     myservlet.class 
    WEB-INF 
    test.property 

Ahora he escrito el código siguiente en una de mis servlet de la siguiente manera:

InputStream stream = getServletContext().getResourceAsStream("/WEB-INF/test.properties"); 
Properties prop = new Properties(); 
prop.load(stream); 

pero por encima de código llegué corriente como nulo. Si pongo el archivo de propiedad en ROOT.war/WEB-INF, funciona bien. Tengo una idea clara de que si la ruta en getResourceAsStream comienza con '/' entonces busca el recurso en la raíz del contexto. Pero, ¿cómo puedo leer el recurso que se encuentra en un contenedor que nuevamente se encuentra en WEB-INF/lib de la aplicación raíz?

, gracias & Saludos, Amit Patel

Respuesta

35

Ponlo en la raíz del JAR y obténgalo por el gestor de clases de contexto en lugar del servletcontext.

ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); 
InputStream input = classLoader.getResourceAsStream("test.properties"); 
// ... 

La convención carpeta /WEB-INF es específico de los archivos WAR, no al JAR archivos. Desaste de eso. Si realmente necesita una carpeta JAR separada que sea parte de la ruta de clase, use /META-INF en su lugar.

ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); 
InputStream input = classLoader.getResourceAsStream("META-INF/test.properties"); 
// ... 
+0

... o deje las cosas tal como están y use "WEB-INF/test.property". –

+0

@bkail, también puede hacerlo, pero no hay ninguna razón para usar la carpeta 'WEB-INF', ya que el servletcontext nunca podrá acceder a él. Tampoco tiene sentido colocar una convención de carpetas específica de WAR en un archivo JAR simple y plano. – BalusC

+0

De acuerdo, no fue sugerir que su respuesta fue incorrecta. Simplemente le da al OP otra opción en caso de que cambiar la estructura JAR sea difícil o no posible por alguna razón. –

6

puede acceder a cualquier recurso en la ruta de clase estándar a partir de un caso dado

this.getClass().getResourceAsStream("name"); 

por ejemplo de la clase de "myservlet" (Bad nomenclatura).

getServletContext().getResourceAsStream() accede al contenido en el contexto del directorio base de la aplicación web.

Parece un mal estilo incluir un directorio WEB-INF en un contenedor: podría causar confusión. ¿No puedes encontrar un nombre mejor?

2

Esto es lo que he encontrado y funcionó para mí. La ayuda provista por @BalusC funcionó para mí. He cotejado lo que he encontrado y cómo he verificado que está funcionando.

Tengo un proyecto con Maven siguiente estructura como se muestra a continuación

project structure

Ahora, cuando voy a construir este proyecto; el frasco se ve como

enter image description here

y aquí queries.properties mueve bajo la carpeta "META-INF". Ahora si este jar tiene una clase que está tratando de utilizar este archivo de propiedad usando Thread.currentThread().getContextClassLoader().getResourceAsStream("queries.properties")

pensando que aún se puede acceder al mismo archivo en la carpeta de recursos como se muestra en la estructura del proyecto, eso es incorrecto.La forma correcta es acceder a través de la carpeta META-INF

ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); 
InputStream is = classLoader.getResourceAsStream("META-INF/queries.properties"); 

¿Cómo lo verifiqué

Basta con crear un proyecto Java sencilla e incluyen el frasco que acaba de crear en su trayectoria de la estructura y crear una instancia de la clase que está teniendo declaraciones de ClassLoader como se mencionó anteriormente. Su código de este nuevo proyecto Java debe ser similar

public static void main(String[] args){ 
     new Queries(); 
    } 

donde Queries es una clase en el tarro que acaba de incluir en su ruta de compilación.

Cuestiones relacionadas