this.getClass (). getClassLoader (). getResource (“…”) et NullPointerException

J’ai créé un projet Maven minimal avec un seul module enfant dans eclipse helios.

Dans le dossier src / test / resources, j’ai mis un seul fichier “install.xml”. Dans le dossier src / test / java, j’ai créé un seul package avec une seule classe qui fait:

@Test public void doit() throws Exception { URL url = this.getClass().getClassLoader().getResource("install.xml"); System.out.println(url.getPath()); } 

mais lorsque je lance le code en tant que test de Junit 4, je reçois juste une exception NullPointerException. Cela a bien fonctionné un million de fois auparavant. Des idées?

J’ai suivi ce guide:

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

mais toujours obtenir la même erreur.

Lorsque vous utilisez

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

getResource va essayer de trouver la ressource relative au paquet. Si tu utilises:

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

getResource le traitera comme un chemin absolu et appellera simplement le classloader comme si vous l’aviez fait.

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

La raison pour laquelle vous ne pouvez pas utiliser un chemin d’ ClassLoader / ClassLoader dans ClassLoader est que tous les chemins d’access ClassLoader sont absolus et que / n’est donc pas un premier caractère valide dans le chemin.

tul,

  • Lorsque vous utilisez .getClass().getResource(fileName) il considère que l’emplacement du nom de fichier est le même emplacement que celui de la classe appelante.
  • Lorsque vous utilisez .getClass().getClassLoader().getResource(fileName) il considère que l’emplacement du nom_fichier est le dossier racine – dans les autres mots bin .

La source :

 package Sound; public class ResourceTest { public static void main(Ssortingng[] args) { Ssortingng fileName = "Kalimba.mp3"; System.out.println(fileName); System.out.println(new ResourceTest().getClass().getResource(fileName)); System.out.println(new ResourceTest().getClass().getClassLoader().getResource(fileName)); } } 

Sortie:

 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 

Ce devrait être getResource("/install.xml");

Les noms de ressources sont relatifs à l’emplacement de la classe getClass (), par exemple si votre test est org/example/foo/MyTest.class alors getResource("install.xml") apparaîtra dans org/example/foo/install.xml .

Si votre install.xml est dans src/test/resources , il se trouve dans la racine du classpath, vous devez donc append le nom de la ressource avec / .

En outre, si cela ne fonctionne que parfois, cela peut être dû au fait que Eclipse a nettoyé le répertoire de sortie (par exemple, target/test-classes ) et que la ressource est simplement absente du chemin de target/test-classes d’exécution. Vérifiez cela à l’aide de la vue Navigateur d’Eclipse au lieu de l’explorateur de packages. Si les fichiers sont manquants, exécutez l’ mvn package .

J’ai eu le même problème avec les conditions suivantes:

  • Les fichiers de ressources se trouvent dans le même package que les fichiers source Java, dans le dossier source java ( src/test/java ).
  • Je construis le projet avec maven sur la ligne de commande et la génération a échoué sur les tests avec l’ NullPointerException .
  • La version de ligne de commande n’a pas copié les fichiers de ressources dans le dossier test-classes , ce qui explique l’échec de la génération.
  • Lors de l’éclipse après la construction de la ligne de commande et de la réexécution des tests dans eclipse, j’ai également obtenu l’ NullPointerException dans eclipse.
  • Lorsque j’ai nettoyé le projet (supprimé le contenu du dossier cible) et reconstruit le projet dans Eclipse, le test s’est correctement déroulé. Cela explique pourquoi il s’exécute lorsque vous commencez avec un projet propre.

J’ai résolu ce problème en plaçant les fichiers de ressources dans le dossier resources dans test: src/test/resources utilisant la même structure de package que la classe source.

BTW j’ai utilisé getClass().getResource(...)

Lorsque eclipse exécute le scénario de test, il recherche le fichier dans target / classes pas src / test / resources. Lorsque la ressource est enregistrée, eclipse doit la copier depuis src / test / resources vers target / classes si elle a changé mais si, pour une raison quelconque, cela ne s’est pas produit, vous obtiendrez cette erreur. Vérifiez que le fichier existe dans target / classes pour voir si c’est le problème.

Je pense que j’ai rencontré le même problème que le vôtre. J’ai créé un projet mvn simple et utilisé “mvn eclipse: eclipse” pour configurer un projet eclipse.

Par exemple, mon fichier source “Router.java” se trouve dans “java / main / org / jhoh / mvc”. Et Router.java veut lire le fichier “routes” qui se trouve dans “java / main / org / jhoh / mvc / resources”

Je lance “Router.java” dans eclipse, et la console eclipse a NullPointerExeption. Je définis pom.xml avec ce paramètre pour que tous les fichiers bytecode Java * .class soient localisés dans le répertoire de compilation.

  package ${basedir}/build  

Je suis allé dans le répertoire “build / classes / org / jhoh / mvc / resources”, et il n’y a pas de “routes”. Eclipse N’a PAS copié “routes” dans “build / classes / org / jhoh / mvc / resources”

Je pense que vous pouvez copier votre “install.xml” dans votre répertoire * .class bytecode, PAS dans votre répertoire de code source.

J’ai eu le même problème en travaillant sur un projet avec Maven. Voici comment je l’ai corrigé: je viens de mettre les sources (images, musiques et autres choses) dans le répertoire des ressources:

 src/main/resources 

J’ai également créé la même structure pour les packages du répertoire resources. Par exemple:

Si ma classe est en cours

 com.package1.main 

Dans le répertoire des ressources, j’ai mis un paquet avec le même nom

 com.package1.main 

Donc j’utilise

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

Une autre chose à regarder qui a résolu le problème pour moi:

Dans un projet Eclipse / Maven, j’avais des classes Java dans src/test/java dans lesquelles j’utilisais this.getClass().getResource("someFile.ext"); pattern pour rechercher des ressources dans src/test/resources où le fichier de ressources se trouvait dans le même emplacement de package dans le dossier source de ressources que la classe de test se trouvait dans le dossier source du test. Il n’a toujours pas réussi à les localiser.

Faites un clic droit sur le dossier source src/test/resources , Build Path, puis “configurez les filtres d’inclusion / exclusion”; J’ai ajouté un nouveau filtre d’inclusion de **/*.ext pour m’assurer que mes fichiers ne sont pas nettoyés; mes tests peuvent maintenant trouver leurs fichiers de ressources.