web-dev-qa-db-fra.com

Java - class.getResource renvoie null

J'utilise ce qui suit pour obtenir l'URL de ce fichier particulier, mais il renvoie null. Quelqu'un a-t-il des suggestions quant au problème ou une autre manière de le faire?

URL url = ExchangeInterceptor.class.getResource("GeoIP.dat");
42
Buddhi

Pour ceux qui utilisent Idée Intellij: vérifier Paramètres -> Compilateur -> Modèles de ressources.

Le paramètre contient toutes les extensions devant être interprétées comme des ressources. Si une extension ne respecte aucun modèle ici, class.getResource retournera la valeur null pour les ressources utilisant cette extension.

41
yggdraa

Le chemin est relatif à la racine du chemin de classe et si vous ne spécifiez pas de chemin absolu, il recherche dans le même package que la classe que vous utilisez (dans ce cas, ExchangeInterceptor). Pour trouver quelque chose dans la racine, utilisez /GeoIP.dat.

29
Martin Algesten

Utilisez la méthode getResource de la classe 'ClassLoader

URL url = ExchangeInterceptor.class.getClassLoader().getResource("GeoIP.dat");
17
Wins

J'ai résolu ce problème en soulignant le resource root sur IDEA.

Au départ, le répertoire était tel et l'icône était une icône de dossier simple

Avant

 enter image description here

Right click sur un répertoire (ou simplement le nom du projet) -> Mark directory As -> Resource Root.

Après

 after

Recompiler & réjouir: P

7
MewX

Non, c'est la bonne façon autant que je sache. Assurez-vous que la ressource est sur votre chemin de classe. C'est souvent la cause de ce type de problèmes.

4
javamonkey79

Si vous utilisez Gradle et IntelliJ, et modifier Resource patterns n'a pas fonctionné, et vos racines de ressources sont définies correctement ... vous pouvez essayer ceci:

 enter image description here

Settings > Build, Execution, Delpoyment > Build Tools > Gradle > Runner > Delegate IDE build/run actions to gradle. (IntelliJ 2017.3.3)

Source: https://youtrack.jetbrains.com/issue/IDEA-176738#comment=27-2518612

4
Max

Juste au cas où quelqu'un aurait encore du mal à comprendre cela:

.getResource () vous autorise à accéder au dossier bin local. Cela signifie que vos ressources doivent être situées dans YourProject/bin/package /. Le dossier racine est YourProject/bin/et peut être accédé en ajoutant le préfixe/à l’argument String, comme indiqué par iirekm.

2
merovin

Où avez-vous mis ce GeoIP.dat? Dans le même package que ExchangeInterceptor ou dans le package "racine". Si dans le même package, votre code est OK, si à la racine - ajoutez le préfixe '/'.

Vous utilisez peut-être M2Eclipse? Si la configuration est incorrecte, cela peut également entraîner de tels problèmes. Une autre cause de tels problèmes peut être: des chargeurs de classes mal configurés, des OSGi mal configurés, ...

1
iirekm

Le fichier doit être dans le chemin de classe, par exemple: -

bin/mon/package/GeoIP.dat

Le préfixe/semble être un mensonge. Ce qui suit fonctionnerait.

URL url = ExchangeInterceptor.class.getResource("my/package/GeoIP.dat");

Je soupçonne que le problème est que vous n'avez pas le fichier dans le classpath.

1
Peter Jamieson

Au lieu d'avoir le fichier de ressources dans le même dossier que vos fichiers source, créez un dossier resources parallèle au dossier source Java.

Avant:

  • src
    • principale
      • Java
        • MyClass.Java
        • fichier.bin
        • fichier.txt

Après:

  • src
    • principale
      • Java
        • MyClass.Java
      • ressources
        • fichier.bin
        • fichier.txt
0
Pnemonic