Ich versuche, einen Weg zu einer Ressource zu finden, aber ich hatte kein Glück.
Dies funktioniert (sowohl in der IDE als auch mit der JAR), aber auf diese Weise kann ich keinen Pfad zu einer Datei erhalten, sondern nur den Dateiinhalt:
ClassLoader classLoader = getClass().getClassLoader();
PrintInputStream(classLoader.getResourceAsStream("config/netclient.p"));
Wenn ich das mache:
ClassLoader classLoader = getClass().getClassLoader();
File file = new File(classLoader.getResource("config/netclient.p").getFile());
Das Ergebnis ist:
java.io.FileNotFoundException: file:/path/to/jarfile/bot.jar!/config/netclient.p (No such file or directory)
Gibt es eine Möglichkeit, einen Pfad zu einer Ressourcendatei zu erhalten?
Antworten:
Das ist absichtlich. Der Inhalt der "Datei" ist möglicherweise nicht als Datei verfügbar. Denken Sie daran, dass Sie es mit Klassen und Ressourcen zu tun haben, die Teil einer JAR-Datei oder einer anderen Art von Ressource sein können. Der Klassenladeprogramm muss der Ressource kein Dateihandle bereitstellen. Beispielsweise wurde die JAR-Datei möglicherweise nicht in einzelne Dateien im Dateisystem erweitert.
Alles, was Sie tun können, indem Sie eine java.io.File abrufen, können Sie tun, indem Sie den Stream in eine temporäre Datei kopieren und dasselbe tun, wenn eine java.io.File unbedingt erforderlich ist.
quelle
Achten Sie beim Laden einer Ressource auf den Unterschied zwischen:
und
Ich denke, diese Verwirrung verursacht die meisten Probleme beim Laden einer Ressource.
Wenn Sie ein Bild laden, ist es außerdem einfacher zu verwenden
getResourceAsStream()
:Wenn Sie wirklich eine (Nicht-Image-) Datei aus einem JAR-Archiv laden müssen, können Sie Folgendes versuchen:
quelle
bin
Ordner legen und in das Verzeichnis der Klasse wechseln, die in die Ressourcen geladen wird, bevor Sie den Pfad "/com/myorg/filename.ext" verwenden.Die einzeilige Antwort lautet -
Grundsätzlich
getResource
gibt Methode die URL an. Über diese URL können Sie den Pfad durch Aufrufen extrahierentoExternalForm()
Verweise:
getResource () , toExternalForm ()
quelle
file:/
Pfad hinzu, der in jar funktioniert, aber nicht in IDEIch habe eine Weile mit diesem Problem herumgespielt, weil seltsamerweise keine Lösung, die ich gefunden habe, tatsächlich funktioniert hat! Das Arbeitsverzeichnis ist häufig nicht das Verzeichnis der JAR, insbesondere wenn eine JAR (oder ein anderes Programm) über das Startmenü unter Windows ausgeführt wird. Also hier ist, was ich getan habe, und es funktioniert für .class-Dateien, die von außerhalb einer JAR ausgeführt werden, genauso wie es für eine JAR funktioniert. (Ich habe es nur unter Windows 7 getestet.)
quelle
Wenn
netclient.p
es sich in einer JAR-Datei befindet, hat es keinen Pfad, da sich diese Datei in einer anderen Datei befindet. In diesem Fall ist der beste Weg, den Sie haben können, wirklichfile:/path/to/jarfile/bot.jar!/config/netclient.p
.quelle
Sie müssen den Pfad in der JAR-Datei verstehen.
Beziehen Sie sich einfach relativ darauf. Wenn Sie also eine Datei (myfile.txt) haben, die sich in foo.jar unter dem
\src\main\resources
Verzeichnis befindet (Maven-Stil). Sie würden sich darauf beziehen wie:Wenn Sie Ihr JAR mit
jar -tvf myjar.jar
ausgeben, sehen Sie die Ausgabe und den relativen Pfad in der JAR-Datei und verwenden die FORWARD SLASHES.quelle
File.separator
.In meinem Fall habe ich stattdessen ein URL-Objekt verwendet.
Datei
Ressource im Klassenpfad mit Classloader
Wenn ich den Inhalt lesen muss, kann ich den folgenden Code verwenden:
Und Sie können mit einem InputStream auf den Inhalt zugreifen.
quelle
Dies ist derselbe Code von Benutzer Tombart mit Stream Flush und Close, um eine unvollständige temporäre Kopie des Dateiinhalts aus der JAR-Ressource zu vermeiden und eindeutige temporäre Dateinamen zu erhalten.
quelle
Eine Datei ist eine Abstraktion für eine Datei in einem Dateisystem, und die Dateisysteme wissen nichts über den Inhalt einer JAR.
Versuchen Sie es mit einer URI. Ich denke, es gibt ein jar: // -Protokoll, das für Ihre Zwecke nützlich sein könnte.
quelle
Der folgende Weg hat bei mir funktioniert:
classpath:/path/to/resource/in/jar
quelle
Dies
getSystemResourceAsStream
ist die beste Option. Durch Abrufen des Eingabestreams anstelle der Datei oder der URL funktioniert dies in einer JAR-Datei und als eigenständige Datei.quelle
Es mag etwas spät sein, aber Sie können meine Bibliothek KResourceLoader verwenden , um eine Ressource aus Ihrem Glas zu erhalten:
quelle
In einer JAR-Datei befindet sich die Ressource absolut in der Pakethierarchie (nicht in der Dateisystemhierarchie). Wenn Sie also die Klasse com.example.Sweet haben, die eine Ressource mit dem Namen "./default.conf" lädt, wird der Name der Ressource als "/com/example/default.conf" angegeben.
Aber wenn es in einem Glas ist, dann ist es keine Datei ...
quelle
Fügen Sie in Ihrem Ressourcenordner (java / main / resources) Ihres JAR Ihre Datei hinzu (wir gehen davon aus, dass Sie eine XML-Datei mit dem Namen imports.xml hinzugefügt haben ). Anschließend injizieren Sie,
ResourceLoader
wenn Sie spring like bellow verwendenInnerhalb der Tour-Funktion schreiben Sie den folgenden Code, um die Datei zu laden:
quelle
Vielleicht kann diese Methode für eine schnelle Lösung verwendet werden.
quelle
java.lang.NullPointerException: Attempt to invoke virtual method 'java.security.CodeSource java.security.ProtectionDomain.getCodeSource()' on a null object reference
Code folgen!
/ src / main / resources / file
quelle