Maven Zugriff auf files aus einem kompilierten jar

bob_sheknowdas

Aktives Mitglied
Ich versuche Dateien in einer Java-Klasse einzulesen.

Mein Code dafür sieht so aus:
Java:
String s = File.separator;
ClassLoader cl = MyClass.class.getClassLoader();
cl.getResourceAsStream(s + "python" + s + "PythonScript.py"));

Das funktioniert problemlos, wenn ich es in Eclipse ausführe.
Wenn ich aber über "mvn package" ein jar-File erstelle, dann ist der Input-Stream gleich NULL.

Mein Projekt sieht in etwa so aus:
Code:
+ scr/main
++ java
+++ myPackage
++++ MyClass.java
++ resources
+++ python
++++ PythonScript.py

Mein erstelltes jar-File hat folgende Struktur:
Code:
+ MyJar.jar
++ python
+++ PythonScript.py
 
X

Xyz1

Gast
Eigentlisch müsste im jar eher die class Dateien sein anstatt die py.
Erstellst du ein jar mit allen abhängigkeiten?
 

httpdigest

Top Contributor
Das Zeichen zum Trennen der Pfadteile ist per Spezifikation immer der Forwardslash '/' und nicht der betriebssystemspezifische File.separator. Außerdem entferne den ersten Slash. Der Grund, warum es in Eclipse (also mit einem Verzeichnis als Classpath Root) funktioniert, ist, weil der Classloader in diesem Fall das Betriebsystem fragt, die Verzeichnisse aufzulösen. Das tut Java im Falle der Jar-Datei nicht. Verwende also immer den Forwardslash und niemals einen Slash am Anfang, dann funktioniert es für beides.
Korrekt (und auch cross-platform) ist also:
Java:
cl.getResourceAsStream("python/PythonScript.py"));
 

bob_sheknowdas

Aktives Mitglied
Das Zeichen zum Trennen der Pfadteile ist per Spezifikation immer der Forwardslash '/' und nicht der betriebssystemspezifische File.separator. Außerdem entferne den ersten Slash. Der Grund, warum es in Eclipse (also mit einem Verzeichnis als Classpath Root) funktioniert, ist, weil der Classloader in diesem Fall das Betriebsystem fragt, die Verzeichnisse aufzulösen. Das tut Java im Falle der Jar-Datei nicht. Verwende also immer den Forwardslash und niemals einen Slash am Anfang, dann funktioniert es für beides.
Korrekt (und auch cross-platform) ist also:
Java:
cl.getResourceAsStream("python/PythonScript.py"));

Das war die Lösung.
Danke

Thema kann geschlossen werden
 

httpdigest

Top Contributor
Naja, da werden auch schon noch Java-Klasse drin sein. Vielleicht hat er ja einen Python-Interpreter drin, der die python Dateien aus der Jar lädt. Ist ja aber auch eigentlich egal.
 
X

Xyz1

Gast
ja das verstehe ich schon, nur ist der Inhalt der jar unvollständig wiedergegeben
und nacht
 

kodela

Bekanntes Mitglied
Hallo,
für den TE ist das Problem gelöst. Ich habe ein sehr ähnliches Problem, bin aber noch nicht so weit, wie der Themenersteller und hoffe, dass mir hier jemand helfen kann.
Ich greife in einem Programm auf eine gezipte Datei zu, deren Inhalt im Programmverlauf zwar nur geringfügicg, aber doch verändert wird und mit Beendigung des Programms wieder gezipt abgespeichert wird. Das funktioniert einwandfrei.
Nun möchte ich aber diese gezipte Datei in die jar-Datei packen und von dort aus auf sie zugreifen. In meiner Einfalt dachte ich, das könne so gehen:
Java:
    ClassLoader cl = Archiv.class.getClassLoader();
    cl.getResourceAsStream("str8ts/arch.zip");
Aber so einfach ist das wohl nicht. Wie bringe ich die Datei "arch.zip" in die jar-Datei. Ich könnte natürlich zum Beispiel mit 7z in der jar-Datei den Ordner "arch" anlegen und die Datei "arch.zip" dort hinein kopieren. Ich habe auch unter NetBeans im Projektverzeichnis im Ordner "classes\sources" den Unterordner "arch" angelegt. Alles natürlich Unsinn, aber ich hab' es eben probiert.
Wer kann mir einen Rat geben, wie ich vorgehen muss? Danke schon einmal.

MfG, kodela
 

Flown

Administrator
Mitarbeiter
Also in die JAR packen, lesen kein Problem. Wieder zurückschreiben sehr wohl. Einfach gesagt: don't do it.
 

httpdigest

Top Contributor
Benutze einfach eine separate Datei im Dateisystem neben dem Jar oder im User/AppData/Local Verzeichnis oder sonstwo. Nur halt nicht im Jar der Anwendung.
Um zuverlässig den Order herauszufinden, in welchem die jar Datei liegt (um dann daneben eine andere Datei anzulegen oder zu lesen), egal was das current working directory der Anwendung ist (also aus welchem Verzeichnis heraus die Anwendung gestartet wurde), siehe: https://stackoverflow.com/questions/320542/how-to-get-the-path-of-a-running-jar-file
 

kodela

Bekanntes Mitglied
Danke Flown,
ja, in die JAR packen war wirklich kein Problem, ich habe sie im Projektverzeichnis für den Quellcode in einen eigenen Unterordner gelegt, in einem anderen sind dort ja bereits die ganzen Bilddateien für die Symbole, und schon wurde der neu Ordner samt der ZIP Datei mit in die JAR gepackt.
Wie müsste ich darauf aber nun zugreifen? Ich frage dies, weil ich eventuell auch noch eine Datei habe, die ich gerne in der JAR hätte und die nicht verändert wird.
Bei der ZIP-Datei würde sich an der Größe übrigens nichts ändern. Es handelt sich um reinen Text, bei dem lediglich einige wenige Zeichen verändert würden. Wäre unter diesen Umständen ein Zurückschreiben eventuell weniger problematisch?

MfG, kodela
 

httpdigest

Top Contributor
Du kannst die Jar Datei nicht ändern!!!

Zumindest unter Windows setzt die JVM beim ersten Zugriff auf die Jar Datei einen read-only Lock auf Dateisystemebene. Versuche mal, eine Java-Anwendung per Jar zu starten und dann mit einem Paketierungstool das Jar zu ändern oder zu ersetzen. Es geht nicht!

Und die Größe einer ZIP-Datei hat nicht direkt etwas mit der Größe des enthaltenen Inhaltes zu tun, sondern mit der Kombination an unterschiedlichen Zeichen/Bytes. Wenn sich also ein Zeichen ändert, kann die ZIP-Datei dadurch schonmal 10 Bytes größer oder kleiner werden. Kommt drauf an, wie viele gleichartige Bytefolgen vorkommen und wie der benutzte LZ-Algorithmus diese kodiert.
Aber die Größe hat trotzdem nichts damit zu tun, ob eine Ersetzung der Datei im Jar möglich ist, oder nicht. Es geht nicht!
 

kodela

Bekanntes Mitglied
Ok, danke, ich hab's verstanden. Bleibt nur noch die Frage, wie ich auf eine Datei (in der JAR) rein lesend zugreifen kann? Ist zwar nicht wirklich wichtig, aber interessieren würde es mich schon.
 

httpdigest

Top Contributor
Naja, rein lesend (also ohne die zu verändern und wieder in die JAR zurückschreiben zu wollen) geht per SomeClass.getClassLoader().getResourceAsStream("path/to/the/file.ext")
 

kodela

Bekanntes Mitglied
Danke, auch wenn ich es jetzt nicht verwenden werde, ist diese Info doch interessant für mich.

Gruß und noch einmal danke, kodela
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
LucasGlockner Effizienter byte-Zugriff auf ein long[]-Array Allgemeine Java-Themen 8
W Klassen Zugriff auf ein Textfile aus allen Klassen. Allgemeine Java-Themen 2
izoards Zugriff auf gemeinsame Ressource (CSV-File) Allgemeine Java-Themen 3
S Java Zugriff auf Netzwerklaufwerk Allgemeine Java-Themen 1
sascha-sphw Java 9 module Zugriff auf eine resource einer anderen JAR Allgemeine Java-Themen 0
KeexZDeveoper Zugriff auf Methoden vom Server Allgemeine Java-Themen 7
O Zugriff auf mySQL ohne JDBC Allgemeine Java-Themen 3
P Element einer Liste wurde hinzugefügt, aber es gibt keinen Zugriff Allgemeine Java-Themen 2
S Zugriff auf jUnit Test Suite Runner-Instanzen innerhalb von Test Classes Allgemeine Java-Themen 7
W Zugriff auf Objektvariablen vs. Übergabe Allgemeine Java-Themen 3
J Zugriff auf erstellte Objekte einer Klasse von einer Klasse ausserhalb Allgemeine Java-Themen 3
Tommy Nightmare HTTP Zugriff auf Internetseite im Loginbereich Allgemeine Java-Themen 5
H Zugriff auf PHP Allgemeine Java-Themen 4
B DB-Zugriff einer Webanwendung funktioniert nicht mit Java 7 Allgemeine Java-Themen 2
M WebService - Zugriff auf Webservice Methode über Browser Allgemeine Java-Themen 1
O JNA Zugriff auf Funktion aus DLL Allgemeine Java-Themen 0
O Zugriff auf Windows Zertifikatstore Allgemeine Java-Themen 2
M Kein Zugriff auf microSD Karten Allgemeine Java-Themen 4
T Zugriff auf Datenbank Allgemeine Java-Themen 1
J Zugriff auf IMAP GMail Konto scheitert. Allgemeine Java-Themen 2
P Frontend- Zugriff auf WS- Backend Allgemeine Java-Themen 0
U Zugriff auf Datei sperren Allgemeine Java-Themen 5
N Best Practice Semi-Synchronized Zugriff Allgemeine Java-Themen 0
C Zugriff auf Event felder Allgemeine Java-Themen 0
M Threads synchroner Zugriff (add/delete/read) auf eine Liste Allgemeine Java-Themen 6
F Zugriff Verweigert bei Kopieroperation? Allgemeine Java-Themen 4
T JNI: kein Zugriff auf VM in Callback-Methode eines Windows-Hooks Allgemeine Java-Themen 3
S Dynamischer Zugriff Allgemeine Java-Themen 4
Minonos Einem Programm Zugriff auf bestimmte Ordner geben Allgemeine Java-Themen 5
E Zugriff auf Dateien im Filesystem überwachen Allgemeine Java-Themen 5
H Programierstil: static - Zugriff vs. Staticzugriff Allgemeine Java-Themen 24
V Zugriff auf den Objekterzeuger? Allgemeine Java-Themen 4
M Zugriff zweier Threads auf diesselbe Methode Allgemeine Java-Themen 16
B Zugriff auf eine HashMap Allgemeine Java-Themen 4
B JApplet Zugriff auf Local Storage des Browser? Allgemeine Java-Themen 2
D Zugriff auf Array-Liste Allgemeine Java-Themen 19
M gleichzeitiger Zugriff auf eine Textdatei Allgemeine Java-Themen 6
D Eclipse Kein Zugriff auf Inhalt einer referenzierten .jar Allgemeine Java-Themen 5
B synchronisierter zugriff auf Objekt Allgemeine Java-Themen 6
nutellastulle Zugriff, Übergabe, Bearbeitung und Ausgabe von Jlist Allgemeine Java-Themen 6
U Große Liste von Strings mit indiziertem Zugriff Allgemeine Java-Themen 31
J XML Element Zugriff Allgemeine Java-Themen 4
P Daten kopieren mit nio - Zugriff verweigert Allgemeine Java-Themen 8
M Klassen Zugriff auf getMethode ohne Klasse zu erzeugen Allgemeine Java-Themen 6
A Input/Output Applet-Zugriff auf PHP-Schnittstelle (externer Server) Allgemeine Java-Themen 22
H Vererbung Abgeleitete Klassen und Zugriff Allgemeine Java-Themen 2
C Probleme mit dem Zugriff auf private Methode per reflection Allgemeine Java-Themen 2
J Zugriff auf Poker-Client Fenster Allgemeine Java-Themen 14
C Zugriff auf private Methode per reflection geht nicht mehr Allgemeine Java-Themen 3
S Zugriff auf innere Klasse Allgemeine Java-Themen 3
D Kein Zugriff auf WebService ausser localhost Allgemeine Java-Themen 4
Sonecc Zugriff auf Class File einer anderen Jar während der Laufzeit Allgemeine Java-Themen 2
J Zugriff auf Dateien auf einem shared Folder? Allgemeine Java-Themen 3
H Zugriff auf VBA in Java Allgemeine Java-Themen 2
Haave Audio Device Unavailable: Kein gleichzeitiger Zugriff auf Soundsystem möglich Allgemeine Java-Themen 7
G Letzter Zugriff auf Datei Allgemeine Java-Themen 5
C java.io.FileNotFoundException: (Zugriff verweigert) Allgemeine Java-Themen 14
O Zugriff auf Serielle Schnittstelle - Keine Ports gefunden. Allgemeine Java-Themen 8
C Webstart: Zugriff auf lokale Dateien? Allgemeine Java-Themen 2
X Zugriff auf ComboBoxen in Hauptklasse von zweiter Klasse aus Allgemeine Java-Themen 8
J Zugriff auf gemeinsame Funktionen Allgemeine Java-Themen 4
Airwolf89 Zugriff auf ArrayList<ArrayList> Allgemeine Java-Themen 3
Airwolf89 Zugriff auf Werte in ArrayList<ArrayList> Allgemeine Java-Themen 4
T Zugriff zwischen Klassen für repaint Allgemeine Java-Themen 7
N Zugriff auf eine Referenzvar. Allgemeine Java-Themen 3
S Zugriff auf Klasse Allgemeine Java-Themen 4
Meldanor Mehrdimensionale Arrays : Zugriff auf n-tes Array Allgemeine Java-Themen 5
E JNA:Zugriff auf Common-Block von Fortran bzw. Struct in C Allgemeine Java-Themen 2
T Zugriff auf Singleton verkürzen - Namespaces?? Allgemeine Java-Themen 20
L Zugriff auf ein Objekt mit mehreren Threads Allgemeine Java-Themen 11
Airwolf89 dynamischer Zugriff auf Variablen/ Objekte Allgemeine Java-Themen 4
S Zugriff auf einzelne Bildpunkte Allgemeine Java-Themen 3
D Referenzen weiterreichen vs. statischer Zugriff Allgemeine Java-Themen 3
V Zugriff auf Default-Package? Allgemeine Java-Themen 6
P RegeEx-Problem: Zugriff auf group Allgemeine Java-Themen 2
M Zugriff auf Parallel-Schnittstelle Allgemeine Java-Themen 2
B Zugriff mit einem Applet auf den Datenträger Allgemeine Java-Themen 11
S Innere Klasse: Zugriff auf äußere Variable Allgemeine Java-Themen 5
I Zugriff auf Daten Allgemeine Java-Themen 5
T Zugriff per Reflection o.ä. möglich? Allgemeine Java-Themen 18
D Zugriff auf Windows Dienste Allgemeine Java-Themen 7
G Zugriff auf Memberclasses einer geladenen Class-Datei Allgemeine Java-Themen 2
I Gleichzeitiger zugriff auf ein Long über Threads Allgemeine Java-Themen 2
P Wieso HashMap-Zugriff mit Object, statt mit MyObject? Allgemeine Java-Themen 12
J Kein Zugriff auf Klassen im Default Package Allgemeine Java-Themen 8
M Paralleler Zugriff auf statische Methode Allgemeine Java-Themen 5
S Zugriff auf unterschiedliche JREs Allgemeine Java-Themen 7
M "Unzulässiger Zugriff auf einen Speicherbereich" Allgemeine Java-Themen 7
A Zugriff auf Parallelport nur über Eclipse nicht über .jar ! Allgemeine Java-Themen 12
G Zugriff auf ein sama share Allgemeine Java-Themen 8
J Java zugriff auf Exchange Server Allgemeine Java-Themen 10
D eclipse: Zugriff auf Ordner per code Allgemeine Java-Themen 4
O Konkurrierender Zugriff auf Log-Datei mit Log4J Allgemeine Java-Themen 11
Caracasa [Threads] Gleichzeitiger Zugriff auf eine LinkedList Allgemeine Java-Themen 9
L Zugriff auf Objekt das sich in einer Liste befindet Allgemeine Java-Themen 2
J Zugriff auf den Namen einer Variablen Allgemeine Java-Themen 7
J Zugriff auf Map in anderer Klasse Allgemeine Java-Themen 2
J Endlosschleife durch wechselseitigen Zugriff zweier Klassen? Allgemeine Java-Themen 2
F Zugriff auf lokalen Rechner wer weiss Rat ? Allgemeine Java-Themen 16
G Zugriff auf Dateien in jar-Datei Allgemeine Java-Themen 13

Ähnliche Java Themen

Neue Themen


Oben