2010-09-27 17 views
47

He creado un proyecto maven mínimo con un solo módulo secundario en eclipse helios.this.getClass(). GetClassLoader(). GetResource ("...") y NullPointerException

En la carpeta src/test/resources he puesto un solo archivo "install.xml". En la carpeta src/test/java He creado un solo paquete con una sola 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 unidad de prueba JUnit 4 que acaba de obtener una NullPointerException. Esto ha funcionado bien un millón de veces antes. ¿Algunas ideas?

que han seguido esta guía:

http://www.fuyun.org/2009/11/how-to-read-input-files-in-maven-junit/

pero aún así obtener el mismo error.

Respuesta

73

Cuando se utiliza

this.getClass().getResource("myFile.ext") 

getResource va a tratar de encontrar el recurso en relación con el paquete. Si utiliza:

this.getClass().getResource("/myFile.ext") 

getResource la tratará como una ruta absoluta y simplemente llamar al cargador de clases como el que tendría si había hecho.

this.getClass().getClassLoader().getResource("myFile.ext") 

La razón por la que no puede utilizar un líder / en el camino ClassLoader se debe a que todos los caminos ClassLoader son absolutos y por lo / no es un carácter válido en primer lugar en el camino.

+0

Resultó que el equipo principal que mi equipo usa solo incluye * .xml y * .properties. Ahora ... por qué esto funcionó en mi estación de trabajo de Windows no estoy seguro. Incluso busqué en mi repositorio maven local para verificar que tenía el mismo pom que lo que estaba en el linux box. – AmishDave

+2

Hola @AmishDave, tu pregunta de seguimiento (si aún necesitas una respuesta) debe publicarse como una nueva pregunta. No dude en volver a vincular esta pregunta y/o esta respuesta, pero tener una pregunta de seguimiento en una respuesta no es convencionalmente cómo funciona Stack Overflow. ¡Gracias! :-) –

16

Debería ser getResource("/install.xml");

Los nombres de recursos son en relación con el que 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 de la ruta de clases, por lo tanto, lo que necesita para 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 en tiempo de ejecución. Verifique que usando la vista Navigator de Eclipse en lugar del Explorador de paquetes. Si faltan los archivos, ejecute el objetivo mvn package.

+1

También he intentado: this.getClass(). GetClassLoader(). GetResource ("/ install.xml"); no ayuda (Todos mis otros proyectos que leen recursos no usan el prefijo "/" y funcionan bien). También intenté ejecutar mvn clean install (tanto desde la línea de comandos como desde eclipse) en el padre y el hijo, pero sigue teniendo el mismo problema. Cuando compruebo la carpeta secundaria: target/test-classes en la vista del navegador está vacía, supongo que esto es malo. – u123

+0

sí, eso es malo. Publica la parte de tu pom donde especificaste (si la hubiera) las etiquetas . ¿Quizás estás haciendo algo de o allí? mvn install definitivamente debe copiar sus archivos de recursos a las clases resp. carpeta de clases de prueba. ¿Estás usando M2Eclipse? – mhaller

+0

No he tocado ninguna declaración de inclusión/exclusión. Encontré esto: https://issues.sonatype.org/browse/MNGECLIPSE-823 que podría tratar este problema. He creado un nuevo proyecto y funciona de nuevo. – u123

29

tul,

  • Cuando se utiliza .getClass().getResource(fileName) se tiene en cuenta la ubicación del nombre de archivo es el mismo lugar de la clase de la llamando.
  • Cuando utiliza .getClass().getClassLoader().getResource(fileName) considera que la ubicación del archivoName es la raíz - en otras palabras bin carpeta.

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 
+0

¿Qué debo hacer para tener los recursos de Maven de la carpeta de recursos en el contenedor? Veo que incluso cuando ejecuto la instalación de Maven, no aparecen allí. Pero probablemente entiendo algo simplemente mal :) – Line

3

tuve el mismo problema con las siguientes condiciones:

  • Los archivos de recursos están en el mismo paquete que el los archivos fuente java, en la carpeta fuente java (src/test/java).
  • Construyo el proyecto con maven en la línea de comandos y la construcción falló en las pruebas con el NullPointerException.
  • La compilación de línea de comandos no copió los archivos de recursos en la carpeta test-classes, lo que explicaba el error de compilación.
  • Cuando voy a eclipsar después de la línea de comando construir y volver a ejecutar las pruebas en eclipse también obtuve el 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 solucioné colocando los archivos de recursos en la carpeta de recursos en la prueba: src/test/resources utilizando la misma estructura de paquete que la clase de origen.

Por cierto solía getClass().getResource(...)

0

que tenía el mismo problema trabajando en un proyecto con Maven. Aquí cómo me fijo: acabo de poner las fuentes (imágenes, músicas y otras materias) en el directorio de recursos:

src/main/resources 

creé la misma estructura de los paquetes en el directorio de recursos también. Por ejemplo:

Si mi clase está en

com.package1.main 

En el directorio de recursos pongo un paquete con el mismo nombre

com.package1.main 

lo tanto, utilizar

getClass().getResource("resource.png"); 
1

I 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 el archivo "rutas" que se ubica 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 a directorio "build/classes/org/jhoh/MVC/recursos", y no hay "rutas".Eclipse AÚN NO copia "rutas" a "construir/classes/org/jhoh/MVC/recursos"

Creo que se puede copiar su "install.xml" a su directorio * .class código de bytes, NO en su directorio de código fuente

2

Cuando eclipse ejecuta el caso de prueba, buscará el archivo en target/classes not 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.

0

Otra cosa que mirar que resuelto para mí:

En un proyecto de Eclipse/Maven, tuve clases de Java en src/test/java en la que yo estaba usando el patrón this.getClass().getResource("someFile.ext"); a buscar recursos en src/test/resources donde el recurso el archivo estaba en la misma ubicación del paquete en la carpeta de origen de los recursos ya que la clase de prueba estaba en la carpeta fuente de la prueba. Todavía no pudo ubicarlos.

Haga clic con el botón derecho en la carpeta de origen src/test/resources, compile la ruta, 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.

Cuestiones relacionadas