ce.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 paquet 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 quand j'exécute le code en tant que test unitaire junit 4, je reçois juste une NullPointerException. Cela a bien fonctionné un million de fois auparavant. Des idées?

J'ai suivi ceci guide:

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

Mais toujours obtenir la même erreur.

49
demandé sur Pascal Thivent 2010-09-27 15:24:55

8 réponses

Lorsque vous utilisez

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

getResource va essayer de trouver la ressource relative au paquet. Si vous utilisez:

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

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

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

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

79
répondu AmishDave 2016-11-22 09:24:00

Tul,

  • Lorsque vous utilisez .getClass().getResource(fileName) on considère le l'emplacement du nom de fichier est le même emplacement que celui de l'appelant classe.
  • Lorsque vous utilisez .getClass().getClassLoader().getResource(fileName), il considère que l'emplacement du nom de fichier est la racine-en d'autres termes bin dossier.

Source:

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));
    }
}

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
32
répondu namalfernandolk 2011-11-29 00:41:21

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

Les noms des ressources sont relatifs à l'endroit où réside la classe getClass (), par exemple si votre test est org/example/foo/MyTest.class alors getResource("install.xml") regardera dans org/example/foo/install.xml.

Si votre {[4] } est dans src/test/resources, il est à la racine du classpath, vous devez donc ajouter le nom de la ressource avec /.

En outre, si cela ne fonctionne que parfois, C'est peut-être parce Qu'Eclipse a nettoyé le répertoire de sortie (par exemple target/test-classes) et que la ressource est simplement manquante dans le chemin de classe d'exécution. Vérifiez que utilisation de la vue navigateur D'Eclipse au lieu de l'Explorateur de paquets. Si les fichiers sont manquants, exécutez l'objectif mvn package.

17
répondu mhaller 2010-09-27 11:58:22

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

  • Les fichiers de ressources sont dans le même package que les fichiers sources java, dans le dossier source java (src/test/java).
  • je construis le projet avec maven sur la ligne de commande et la construction a échoué sur les tests avec le NullPointerException.
  • la compilation en ligne de commande n'a pas copié les fichiers de ressources dans le dossier test-classes, ce qui explique l'échec de la compilation.
  • lorsque vous allez à eclipse après la ligne de commande, construisez et réexécutez les tests dans eclipse j'ai aussi le 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 exécuté correctement. Cela explique pourquoi il fonctionne lorsque vous démarrez avec un projet propre.

J'ai corrigé cela en plaçant les fichiers de ressources dans le dossier resources dans test: src/test/resources en utilisant la même structure de package que la classe source.

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

3
répondu Hilbrand Bouwkamp 2012-05-22 14:47:42

Lorsque eclipse exécute le cas de test, il recherchera le fichier dans target / classes pas src / test / resources. Lorsque la ressource est enregistrée, eclipse devrait La copier De 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.

2
répondu oenpelli 2013-10-30 06:41:00

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 "Routeur.java" repère dans "java/main/org/jhoh/mvc". Et Le Routeur.java veut lire le fichier "itinéraires" qui se trouve dans "java/main/org/jhoh/mvc/ressources"

Je cours " Routeur.java " dans eclipse, et la console d'eclipse a NullPointerExeption. J'ai mis pom.xml avec ce paramètre pour faire tout *.classez les fichiers de bytecode java recherchez dans le répertoire de construction.

<build>
    <defaultGoal>package</defaultGoal>
    <directory>${basedir}/build</directory>
<build>

Je suis allé au 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 " Installer.xml" à votre *.class bytecode directory, Pas dans votre répertoire de code source.

1
répondu Le Wang 2013-05-16 12:24:39

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 resources:

src/main/resources

J'ai également créé la même structure pour les paquets dans le répertoire resources. Par exemple:

Si ma classe est sur

com.package1.main

Dans le répertoire resources, j'ai mis un paquet portant le même nom

com.package1.main

Donc j'utilise

getClass().getResource("resource.png");
0
répondu 2012-06-18 05:45:33

Une autre chose à regarder qui a résolu pour moi :

Dans un projet Eclipse / Maven, j'avais des classes Java dans src/test/java dans lesquelles j'utilisais le modèle this.getClass().getResource("someFile.ext"); 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 de test. Il ne parvenait toujours pas à localiser.

Faites un clic droit sur le dossier source src/test/resources, construisez le chemin, puis "configurer les filtres d'inclusion/ exclusion" ; j'ai ajouté un nouveau filtre d'inclusion de **/*.ext pour s'assurer que mes fichiers ne sont pas nettoyés; mes tests peuvent maintenant trouver leurs fichiers de ressources.

0
répondu Mikeb 2015-02-02 21:27:55