eclipse - this.getClass(). getClassLoader(). getResource("...") y NullPointerException
maven-2 (8)
He creado un proyecto maven mínimo con un solo módulo hijo en eclipse helios.
En la carpeta src / test / resources he puesto un solo archivo "install.xml". En la carpeta src / test / java, he creado un único paquete con una única clase que hace:
@Test
public void doit() throws Exception {
URL url = this.getClass().getClassLoader().getResource("install.xml");
System.out.println(url.getPath());
}
pero cuando ejecuto el código como una prueba de unidad junit 4, obtengo una NullPointerException. Esto ha funcionado bien un millón de veces antes. ¿Algunas ideas?
He seguido esta guía:
http://www.fuyun.org/2009/11/how-to-read-input-files-in-maven-junit/
pero aún recibes el mismo error.
Creo que encontré el mismo problema que el tuyo. Creé un proyecto de mvn simple y usé "mvn eclipse: eclipse" para configurar un proyecto de eclipse.
Por ejemplo, mi archivo fuente "Router.java" se ubica en "java / main / org / jhoh / mvc". Y Router.java quiere leer las "rutas" de archivos que se ubican en "java / main / org / jhoh / mvc / resources"
Ejecuto "Router.java" en eclipse, y la consola de eclipse tiene NullPointerExeption. Configuré pom.xml con esta configuración para hacer que todos los archivos de código de bytes de * .class java se ubiquen en el directorio de compilación.
<build>
<defaultGoal>package</defaultGoal>
<directory>${basedir}/build</directory>
<build>
Fui al directorio "build / classes / org / jhoh / mvc / resources", y no hay "rutas". Eclipse NO copió "rutas" a "build / classes / org / jhoh / mvc / resources"
Creo que puede copiar su "install.xml" en su directorio * .class bytecode, NO en su directorio de código fuente.
Cuando eclipse ejecuta el caso de prueba, buscará el archivo en target / classes no src / test / resources. Cuando se guarda el recurso, eclipse debe copiarlo de src / test / resources a target / classes si ha cambiado, pero si por alguna razón esto no ha sucedido, entonces obtendrá este error. Verifique que el archivo exista en target / classes para ver si este es el problema.
Cuando usas
this.getClass().getResource("myFile.ext")
getResource
intentará encontrar el recurso relativo al paquete. Si utiliza:
this.getClass().getResource("/myFile.ext")
getResource
lo tratará como una ruta absoluta y simplemente llamará al cargador de clases como lo haría si lo hubiera hecho.
this.getClass().getClassLoader().getResource("myFile.ext")
La razón por la que no puede usar una ruta principal /
en la ruta del ClassLoader
es porque todas las rutas del ClassLoader
son absolutas y, por lo tanto, /
no es un primer carácter válido en la ruta.
Debe ser getResource("/install.xml");
Los nombres de recursos son relativos a donde reside la clase getClass (), por ejemplo, si su prueba es org/example/foo/MyTest.class
entonces getResource("install.xml")
se verá en org/example/foo/install.xml
.
Si su install.xml
está en src/test/resources
, está en la raíz del classpath, por lo tanto, debe anteponer el nombre del recurso con /
.
Además, si solo funciona algunas veces, puede deberse a que Eclipse ha limpiado el directorio de salida (por ejemplo, target/test-classes
) y el recurso simplemente no se encuentra en el classpath de tiempo de ejecución. Verifique que usando la vista Navigator de Eclipse en lugar del Explorador de paquetes. Si faltan los archivos, ejecute el mvn package
.
Otra cosa para mirar que lo resolvió para mí:
En un proyecto de Eclipse / Maven, tenía clases de Java en src/test/java
en las que estaba usando this.getClass().getResource("someFile.ext");
patrón para buscar recursos en src/test/resources
donde el archivo de recursos estaba en la misma ubicación del paquete en la carpeta fuente de recursos que la clase de prueba estaba en la carpeta fuente de prueba. Todavía no pudo ubicarlos.
Haga clic derecho en la carpeta fuente src/test/resources
, Build Path, luego "configure los filtros de inclusión / exclusión"; Agregué un nuevo filtro de inclusión de **/*.ext
para asegurarme de que mis archivos no fueran borrados; mis pruebas ahora pueden encontrar sus archivos de recursos.
Tuve el mismo problema al trabajar en un proyecto con Maven. Aquí lo arreglé: simplemente puse las fuentes (imágenes, músicas y otras cosas) en el directorio de recursos:
src/main/resources
Creé la misma estructura para los paquetes en el directorio de recursos también. Por ejemplo:
Si mi clase está en
com.package1.main
En el directorio de recursos puse un paquete con el mismo nombre
com.package1.main
Entonces yo uso
getClass().getResource("resource.png");
Tuve el mismo problema con las siguientes condiciones:
- Los archivos de recursos están en el mismo paquete que los archivos fuente de Java, en la carpeta de origen de Java (
src/test/java
). - Construyo el proyecto con maven en la línea de comando y la construcción falló en las pruebas con
NullPointerException
. - La compilación de línea de comandos no copió los archivos de recursos en la carpeta de
test-classes
, que explicaba el error de compilación. - Cuando voy a eclipsar después de construir la lınea de comandos y volver a ejecutar las pruebas en eclipse, también obtuve
NullPointerException
en eclipse. - Cuando limpié el proyecto (eliminé el contenido de la carpeta de destino) y reconstruí el proyecto en Eclipse, la prueba se ejecutó correctamente. Esto explica por qué se ejecuta cuando comienzas con un proyecto limpio.
Lo arreglé colocando los archivos de recursos en la carpeta de recursos en la prueba: src/test/resources
usando la misma estructura de paquete que la clase fuente.
Por cierto, utilicé getClass().getResource(...)
tul,
- Cuando utiliza
.getClass().getResource(fileName)
, considera que la ubicación de fileName es la misma ubicación que la de la clase que realiza la llamada. - Cuando usa
.getClass().getClassLoader().getResource(fileName)
, considera que la ubicación de fileName es la raíz - en otras palabras, la carpetabin
.
Fuente :
package Sound;
public class ResourceTest {
public static void main(String[] args) {
String fileName = "Kalimba.mp3";
System.out.println(fileName);
System.out.println(new ResourceTest().getClass().getResource(fileName));
System.out.println(new ResourceTest().getClass().getClassLoader().getResource(fileName));
}
}
Salida:
Kalimba.mp3
file:/C:/Users/User/Workspaces/MyEclipse%208.5/JMplayer/bin/Sound/Kalimba.mp3
file:/C:/Users/User/Workspaces/MyEclipse%208.5/JMplayer/bin/Kalimba.mp3