it-swarm.com.de

Java - class.getResource gibt null zurück

Ich verwende Folgendes, um die URL dieser bestimmten Datei abzurufen, aber es gibt null zurück. Hat jemand irgendwelche Vorschläge bezüglich des Problems oder eine alternative Möglichkeit, dies zu tun?

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

Für diejenigen, die verwenden Intellij Idee: prüfen Auf Einstellungen -> Compiler -> Ressourcenmuster.

Die Einstellung enthält alle Erweiterungen, die als Ressourcen interpretiert werden sollen. Wenn eine Erweiterung hier keinem Muster entspricht, gibt class.getResource für Ressourcen, die diese Erweiterung verwenden, null zurück.

41
yggdraa

Der Pfad ist relativ zum Klassenpfadstamm. Wenn Sie keinen absoluten Pfad angeben, sucht er in demselben Paket wie die von Ihnen verwendete Klasse (in diesem Fall ExchangeInterceptor). Um etwas im Root zu finden, benutze /GeoIP.dat.

29
Martin Algesten

Verwenden Sie die getResource-Methode der Klasse 'ClassLoader

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

Ich habe dieses Problem gelöst, indem ich auf IDEA den resource root hingewiesen habe.

Anfangs war das Verzeichnis so und das Symbol war ein einfaches Ordnersymbol

Vor

 enter image description here

Right click in einem Verzeichnis (oder nur dem Projektnamen) -> Mark directory As -> Resource Root.

Nach dem

 after

Kompilieren und freuen Sie sich: P

7
MewX

Nein, das ist der richtige Weg, afaik. Stellen Sie sicher, dass sich die Ressource in Ihrem Klassenpfad befindet. Dies ist häufig die Ursache für diese Art von Problemen.

4
javamonkey79

Wenn Sie Gradle und IntelliJ verwenden, haben und den Resource patterns nicht funktioniert. Und sind Ihre Ressourcenstämme korrekt gesetzt.

 enter image description here

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

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

4
Max

Während der Verwendung von IntelliJ habe ich das Projekt als JavaFX-App generiert und ihm dann Unterstützung für das Maven-Framework hinzugefügt. Es stellte sich heraus, dass ich meine Ressource dann in src/main/resources Platziert und hinter jedem Ressourcennamen, der sie im Code verwendet, ./ Hinzufügen musste.

Wie bereits in einer früheren Antwort erwähnt, funktionierte das Laden der Ressource nur mit einem classLoader.

Das endgültige Laden der URL erfolgte für mich mit:

URL url = getClass().getClassLoader().getResource(String.format(".%ssample.fxml", File.separatorChar));

Der File.separatorChar Gibt / Unter * nix und \ Unter Windows zurück.

3
Akash Agarwal

Nur für den Fall, dass jemand noch Probleme hat, das zu verstehen:

.getResource () gewährt Ihnen Zugriff auf den lokalen Ordner "bin". Das bedeutet, dass sich Ihre Ressourcen in YourProject/bin/package/befinden müssen. Der Stammordner ist YourProject/bin/und kann durch Hinzufügen des Präfixes/zum String-Argument aufgerufen werden, wie iirekm sagte.

2
merovin

Ich habe mit dem ähnlichen Problem konfrontiert. Von Java SE API für getResource (String name) :

Wenn der Name mit einem '/' ('\ u002f') beginnt, ist der absolute Name der Ressource der Teil des Namens, der auf das '/' folgt.

Also habe ich vor meinem Verzeichnis '/' Hinzugefügt: MyClass.class.getResource("/dir_name/").

Versuchen Sie in Ihrem Fall, vor Ihrem Dateinamen '/' Einzufügen:

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

2
Taras Melnyk

Wo haben Sie diese GeoIP.dat platziert? Im selben Paket wie ExchangeInterceptor oder im "root" -Paket. Wenn Sie in demselben Paket sind, ist Ihr Code OK, wenn Sie im Root-Präfix '/' sind.

Vielleicht verwenden Sie M2Eclipse? Bei falscher Konfiguration kann dies auch zu Problemen führen. Eine andere Ursache für solche Probleme kann sein: falsch konfigurierte Classloader, falsch konfiguriertes OSGi, ...

1
iirekm

Die Datei muss sich im Klassenpfad befinden, z. B .: -

bin/mein/package/GeoIP.dat

Das Präfix/scheint eine Lüge zu sein. Folgendes würde funktionieren.

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

Ich vermute, das Problem ist, dass Sie die Datei nicht im Klassenpfad haben.

1
Peter Jamieson

Dies ist meine Beispiellösung. Arbeite für mich.

Die Projektstruktur:

•   Source Packages
   •    game
       •    Game.Java
   •    game.images
       •    tas_right.png

In der Spielklasse:

URL path=this.getClass().getClassLoader().getResource("images/tas_right.png")
0
samet kaya

Anstatt die Ressourcendatei im selben Ordner wie Ihre Quelldateien zu haben, erstellen Sie einen resources-Ordner parallel zum Java-Quellordner.

Vor:

  • src
    • main
      • Java
        • MyClass.Java
        • file.bin
        • file.txt

Nach dem:

  • src
    • main
      • Java
        • MyClass.Java
      • ressourcen
        • file.bin
        • file.txt
0
Pnemonic