2010-07-13 15 views
6

Hola,getResourceAsStream falla en un entorno nuevo?

TENGO siguiente línea de código:

InputStream passoloExportFileInputStream = getClass().getClassLoader().getResourceAsStream("/com/thinkplexx/lang/de/general.xml"); 

y sé que frasco con com/thinkplexx/lang/es/general.xml está en la ruta de clase.

Funcionó en "entorno anterior", que es maven2 build.

¡Ahora evalúo maven3 y no funciona! Yo sé, que si cambio de que el código sea:

InputStream passoloExportFileInputStream = getClass().getClassLoader().getResourceAsStream("com/thinkplexx/lang/de/general.xml"); 

funciona muy bien (i acaba de quitar de la primera barra de la ruta del recurso).

Btw, yo uso Linux. La primera barra inclinada en la ruta normalmente significa "desde el directorio raíz", por lo que si esta lógica también es válida para la carga de recursos de Java, ¡el primer ejemplo nunca debería haber funcionado !?

preguntas: ¿Es algo malo con el primer ejemplo de código, es decir, con /com/ y no com/? ¿Es solo un código incorrecto o significa algo diferente?

gracias!

+0

La respuesta de Devons funciona para mí. Además, encontré en http://download.oracle.com/docs/cd/E17476_01/javase/1.5.0/docs/guide/lang/resources.html eso: " Los métodos en ClassLoader usan la cadena dada como el nombre del recurso sin aplicar ninguna transformación absoluta/relativa (ver los métodos en Clase). El nombre no debe tener un "/" de inicio. " –

Respuesta

7

Depende de cómo se obtiene el recurso. Cuando se utiliza un ClassLoader como en:

InputStream stream= getClass().getClassLoader().getResourceAsStream("/com/thinkplexx/lang/de/general.xml"); 

El líder '/' no tiene sentido. Entonces, la forma correcta es "com/thinkplexx/lang/de/general.xml".

Si, en cambio se utiliza una 'clase', como en:

InputStream stream= getClass().getResourceAsStream("/com/thinkplexx/lang/de/general.xml"); 

usted consigue un comportamiento diferente. El Class.getResourceAsStream considerará las clases sin un '.' ser relativo al paquete que contiene la clase. Recursos especificados con un '.' son absolutos o se resuelven en relación con la raíz del contenedor.

lo tanto, si this es una referencia a com.example.SomeThing, entonces el comportamiento esperado es:

getClass().getResourceAsStream("https://stackoverflow.com/a/b/c.xml") ==> a/b/c.xml 
getClass().getResourceAsStream("a/b/c.xml") ==> com/example/a/b/c.xml 
getClass().getClassLoader().getResourceAsStream("a/b/c.xml") ==> a/b/c.xml 
getClass().getClassLoader().getResourceAsStream("https://stackoverflow.com/a/b/c.xml") ==> Incorrect 

Maven2 estaba siendo laxa y permitiendo que la última forma.

Cuestiones relacionadas