In meiner Java-App muss ich einige Dateien und Verzeichnisse erhalten.
Dies ist die Programmstruktur:
./main.java
./package1/guiclass.java
./package1/resources/resourcesloader.java
./package1/resources/repository/modules/ -> this is the dir I need to get
./package1/resources/repository/SSL-Key/cert.jks -> this is the file I need to get
guiclass
Lädt die Resourcesloader-Klasse, die meine Ressourcen (Verzeichnis und Datei) lädt.
In Bezug auf die Datei habe ich versucht
resourcesloader.class.getClass().getResource("repository/SSL-Key/cert.jks").toString()
um den wirklichen Weg zu bekommen, aber dieser Weg funktioniert nicht.
Ich habe keine Ahnung, wie das Verzeichnis zu tun ist.
Antworten:
Geben Sie den Pfad relativ zum Klassenlader an, nicht die Klasse, von der Sie den Lader erhalten. Zum Beispiel:
quelle
Ich hatte Probleme mit der
getClass().getResource("filename.txt")
Methode. Wenn sich Ihre Ressource beim Lesen der Java-Dokumentanweisungen nicht im selben Paket befindet wie die Klasse, von der aus Sie auf die Ressource zugreifen möchten, müssen Sie ihr einen relativen Pfad geben, beginnend mit'/'
. Die empfohlene Strategie besteht darin, Ihre Ressourcendateien in einem Ordner "resources" im Stammverzeichnis abzulegen. Also zum Beispiel, wenn Sie die Struktur haben:Anschließend können Sie einen Ressourcenordner hinzufügen, wie von maven empfohlen in:
Außerdem können Sie Unterordner zum Ressourcenordner hinzufügen
und sagen Sie, dass Ihre Datei aufgerufen wird,
myfile.txt
damit Sie habenHier kommt nun das dumme Pfadproblem ins Spiel. Angenommen, Sie haben eine Klasse in Ihrem
com.mycompany.myapp package
und möchtenmyfile.txt
von Ihrem Ressourcenordner aus auf die Datei zugreifen . Einige sagen, Sie müssen geben:oder
beide sind falsch. Nach
mvn clean compile
dem Ausführen werden die Dateien und Ordner in folgende Dateien kopiert:Ordner. Der Ressourcenordner ist jedoch nicht vorhanden, sondern nur die Ordner im Ressourcenordner. Also hast du:
Der richtige Pfad für die
getClass().getResource("")
Methode lautet also:hier ist es:
Dies gibt nicht mehr null zurück, sondern Ihre Klasse. Ich hoffe das hilft jemandem. Es ist seltsam für mich, dass der
"resources"
Ordner nicht ebenfalls kopiert wird, sondern nur die Unterordner und Dateien direkt im"resources"
Ordner. Es erscheint mir logisch, dass sich der"resources"
Ordner auch unter befindet"myapp/target/classes"
quelle
target/classes
Fall kann ich nur Dateien unter Hauptressourcen sehen und keine Ressourcen testen. Warum?mvn clean test-compile
Befehl ausführen , wie ercompile
im Maven-Lebenszyklus ausgeführt wird . Das wird erzeugentarget/test-classes
.In der Hoffnung, zusätzliche Informationen für diejenigen bereitzustellen, die dies nicht so schnell wie andere aufgreifen, möchte ich mein Szenario bereitstellen, da es ein etwas anderes Setup hat. Mein Projekt wurde mit der folgenden Verzeichnisstruktur (mit Eclipse) eingerichtet:
Ich hatte Probleme beim Laden meiner Ressourcen aus dem res- Verzeichnis. Ich wollte alle meine Ressourcen von meinem Quellcode trennen (einfach zu Verwaltungs- / Organisationszwecken). Also musste ich das res- Verzeichnis zum Build-Pfad hinzufügen und dann auf die Ressource zugreifen über:
HINWEIS: Das
/
wird am Anfang der Ressourcenzeichenfolge weggelassen, da ich ClassLoader.getResource (String) anstelle von Class.getResource (String) verwende .quelle
/
am Anfang eines Ressourcenpfads nicht zu verwenden, war der Schlüssel!@GianCarlo: Sie können versuchen, die Systemeigenschaft user.dir aufzurufen, die Ihnen das Stammverzeichnis Ihres Java-Projekts gibt, und diesen Pfad dann an Ihren relativen Pfad anhängen, zum Beispiel:
quelle
File
auf eine Ressource in einer JAR-Datei verweisen, sondern nur auf einen ordnungsgemäßen Eintrag im Dateisystem (z. B. das JAR selbst).Wenn Sie 'getResource' für eine Klasse verwenden, wird ein relativer Pfad basierend auf dem Paket aufgelöst, in dem sich die Klasse befindet. Wenn Sie 'getResource' für einen ClassLoader verwenden, wird ein relativer Pfad basierend auf dem Stammordner aufgelöst.
Wenn Sie einen absoluten Pfad verwenden, beginnen beide 'getResource'-Methoden im Stammordner.
quelle
/
getResource
mit absolutem Pfad im Stammordner? Ist der Zweck des absoluten Pfades nicht absolut ?Für diejenigen, die Eclipse + Maven verwenden. Angenommen, Sie versuchen, auf die Datei
images/pic.jpg
in zuzugreifensrc/main/resources
. So geht's:ist vollkommen korrekt, kann jedoch zu einer Nullzeigerausnahme führen. Eclipse erkennt die Ordner in der Maven-Verzeichnisstruktur anscheinend nicht sofort als Quellordner. Durch Entfernen und
src/main/resources
Zurücksetzen des Ordners aus der Quellordnerliste des Projekts (Projekt> Eigenschaften> Java-Erstellungspfad> Quelle> Ordner entfernen / hinzufügen) konnte ich dieses Problem lösen.quelle
Kann unterteilt werden in:
Dies bedeutet, dass Sie versuchen, die Ressource mithilfe einer Bootstrap-Klasse zu laden.
Stattdessen möchten Sie wahrscheinlich etwas wie:
Wenn nur javac davor warnt, statische Methoden in nicht statischen Kontexten aufzurufen ...
quelle
Machst du folgende Arbeit?
Gibt es einen Grund, warum Sie nicht den vollständigen Pfad einschließlich des Pakets angeben können?
quelle
Gehen Sie mit den beiden Antworten wie oben erwähnt. Der erste
Sollte ein und dasselbe sein?
quelle
Um einen echten Pfad zur Datei zu erhalten, können Sie Folgendes versuchen:
Resourceloader ist hier Klassenname. "resources / repository / SSL-Key / cert.jks" ist der relative Pfad zur Datei. Wenn Sie Ihre Guiclass in ./package1/java mit verbleibender Restordnerstruktur hätten, würden Sie "../resources/repository/SSL-Key/cert.jks" als relativen Pfad verwenden, da Regeln den relativen Pfad definieren.
Auf diese Weise können Sie Ihre Datei mit BufferedReader lesen. Verwenden Sie die Zeichenfolge NICHT, um den Pfad zur Datei zu identifizieren. Wenn Sie Leerzeichen oder Zeichen aus einem nicht englischen Alphabet in Ihrem Pfad haben, treten Probleme auf und die Datei wird nicht gefunden.
quelle
Ich habe eine kleine Änderung am Einzeiler von @ jonathan.cone vorgenommen (durch Hinzufügen
.getFile()
), um eine Nullzeigerausnahme zu vermeiden und den Pfad zum Datenverzeichnis festzulegen . Folgendes hat bei mir funktioniert:quelle
Benutze das:
quelle