2017-01-22 35 views
0

Ich schreibe eine Anwendung, die in zwei Jar-Dateien verpackt ist: startup.jar und resource.jar. In resource.jar Ich habe eine Java-Datei (ResourceFile.java) hat unter Code:NullPointerException bei Verwendung von "class.getResource ("/")"

String dir = ResourceFile.class.getResource("/").getPath(); 

Die Anwendung von ausgeführt werden soll, die „startup.jar“ (zwei JAR-Dateien sind gesetzt im selben Verzeichnis) in Betrieb genommen immer Nullpointer bei Temperaturen oberhalb von Code, aber ich werde, ich habe auch versucht, Code unten, um es zu ändern:

String dir = ResourceFile.class.getClassLoader().getResource("").getPath(); 

haben sie den gleichen Fehler.

System.out.println(ResourceFile.class.getResource("/") == null); 

drucken wahr.

Ich habe mich ein wenig umgeschaut und konnte keine Lösung finden, die mir helfen könnte, das Problem zu lösen.

+0

Sie können nur Dateien mit 'getResource' erhalten, wenn sie von einem Jar ausgeführt werden und sie existieren müssen. –

+3

Warum erwartet man, dass die Ressource '"/"oder" "existiert? – rkosegi

+0

@rkosegi Abhängig davon, wie das jar erstellt wird (wenn der zip nur Dateien enthält oder auch Verzeichniseinträge enthält, wenn ich mich nicht irre), kann 'getResource (" ")' auf den Ordner des Pakets in der JAR-Datei von verweisen die angegebene Klasse –

Antwort

0

Das Problem ist, dass die ResourceFile.class.getResource("/") wird null zurückkehren, wenn sie von einem Klassenpfad ausführen, die nur Gläser enthalten, das heißt, weil ein getResource kehrt null, wenn etwas nicht existiert, und in einem Pfad Klasse, bestehend aus Gläsern, Stammverzeichnisse sind wird nicht als vorhanden betrachtet (andere Verzeichnisse können oder können nicht existieren, abhängig davon, wie das jar erstellt wurde). Wenn der Klassenpfad Verzeichnisse enthält, verweist er möglicherweise nicht auf den erwarteten Speicherort!

Ich denke, Sie sind für den Standort des Glases suchen, die Sie mit finden:

ResourceFile.class.getProtectionDomain().getCodeSource().getLocation(); 

Das ResourceFile ist eine Klasse in Ihrem eigenen Glas, und nicht eine andere Abhängigkeit annimmt. Beachten Sie, dass die von diesem Codeteil erzeugte URL auf das Glas selbst verweist!

Ich kenne Ihren Anwendungsfall nicht, aber Sie sollten sorgfältig überlegen, ob dies wirklich das ist, was Sie brauchen.

+0

Ja, wenn ich den Klassenpfad meiner "startup.jar" drucke, enthält er nur diese JAR-Datei, wo und wie kann ich den Klassenpfad ändern? Vielen Dank. – Hui

+0

Das JAR, von dem aus Sie das Programm ausführen, deklariert in seiner Manifestdatei eine Zeile "Class-Path:". Weitere Informationen finden Sie in der Dokumentation zum Tool "jar". –

+0

@Hui, was versuchst du zu tun? Wenn Sie den Speicherort des Jars verwenden möchten, verwenden Sie die Schutzdomäne. Andernfalls müssen Sie wirklich erklären, was Sie zu tun versuchen. –

Verwandte Themen