Aus jar Ordner lesen

  • Themenstarter Themenstarter Gelöschtes Mitglied 31731
  • Beginndatum Beginndatum
G

Gelöschtes Mitglied 31731

Gast
Hallo,
ich habe ein kleines Problem mit Jar Files.
Und zwar möchte ich gerne wenn ich mein Programm laufen lasse auf eine Datei, welche sich innerhalb der jar liegt zugreifen.
Nun versucht mein Programm bei angabe der Datei "res/datei.html" auf den Ordner außerhalb der jar zuzugreifen.

Wie kann ich die Jar konfigurieren, so dass bei angabe von "res/datei.html" die interne jar datei genutzt wird?


Danke

Gruß
 
Und zwar möchte ich gerne wenn ich mein Programm laufen lasse auf eine Datei, welche sich innerhalb der jar liegt zugreifen.
Von wo willst du da zugreifen? Von außen kannst du auf die HTML Datei nicht zugreifen, dazu müsste das archiv erst entpackt werden.

Nun versucht mein Programm bei angabe der Datei "res/datei.html" auf den Ordner außerhalb der jar zuzugreifen.

Wie kann ich die Jar konfigurieren, so dass bei angabe von "res/datei.html" die interne jar datei genutzt wird?
Öhm was? interne jar datei? Order außerhalb der jar?
Erklär bitte nochmal etwas genau auf was zu von wo zugreifen willst.
 
Also ich habe ein Programm geschrieben.
In diesem Programm habe ich zum validieren einen Befehl drin, welche dies erledig.
Dafür benötige ich ja aber eine XSD.

Wenn ich es über eclipse laufen lasse funktioniert alles wie gewollt (hier findet er die XSD)

Nun will ich aber mein Programm gere in eine Jar verpacken, damit ich diese leicht verteilen kann.

Wenn ich aber jetzt mein Tool starte, kann er die XSD nicht finden, da er ja außerhalb der Jar nach der XSD sucht, aber keine findet.

Ich würde meinen Programm gerne sagen:
"Wenn du in einer Jar ausgeführt wirst dann nimm bitte die "interne" XSD, ansonsten die "externe""
 
Kommt darauf an wie die Schema Datei verwendet wird. Vermutlich muss diese zunächst aus dem jar extrahiert werden, damit Sie als Datei vorliegt.
Code:
getClass().getResourceAsStream(...)
liefert einen InputStream mit dem man die XSD aus dem jar auslesen kann.
 
Sehr geehrter Herr roadrunner,

Java arbeitet nicht mit relativer Adressierung bei der Lokalisation von Ressourcen, sondern mit absoluter Adressierung. Da sie nicht wissen können, wo sich später das JAR-File auf einem Zielrechner befindet, kann die Applikation auch nicht den absoluten Pfad kennen.

Daher müssen Sie zunächst den absoluten Pfad ihrer Datei innerhalb des JAR-Files als "Unified Reccource Locator" bestimmen.

Die Standardmethode dazu ist getclass().getResource(String name).
Die Methode gibt einen URL zurück. In Ihrem Fall folgender Aufruf:

getclass().getResource("/res/datei.html")

Mit freundlichen Grüßen

Der JavaProfi
 
[ot]Hi JavaProfi, wir pflegen hier einen lockeren ungezwungenen Umgangston. Ein Sie ist daher nicht nötig. 😉
BTW: Herzlich willkommen! :meld:[/ot]
 
Hallo JavaProfi,
danke für deine Antwort.
Ich habe das jetzt mal sofort ausprobiert. Es funktioniert aber nicht!
Was kann ich dabei falsch machen?
 
Hallo,
ich habe folgenden Code:
Java:
		if(schema == null) {
			final SchemaFactory schemaFactory = 
					SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
			schema = schemaFactory.newSchema(new File("res/xsd/config.xsd"));
		}
 
Hallo,
ich habe folgenden Code:
Java:
		if(schema == null) {
			final SchemaFactory schemaFactory = 
					SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
			schema = schemaFactory.newSchema(new File("res/xsd/config.xsd"));
		}
wie schon oben gesagt musst du das ganze ueber [c]getClass().getResource("/res/xsd/datei.html")[/c] laden. Die Datei muss dann im jar unter dem Ordner res/xsd liegen bzw wenn du in eclipse arbeitest und noch kein jar hast muss dieser Pfad im Classpath liegen
 
Das hat ja eben nicht funktioniert:

Java:
        if(schema == null) {
            final SchemaFactory schemaFactory = 
                    SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
            schema = schemaFactory.newSchema(new File(getClass().getResourceAsStream("/res/xsd/config.xsd")));
        }
 
Ich habe es gerade nochmals versucht, aber ich bekomme immer null heraus.
Ich habe auch schon den Classpath gesetzt (hoffe ich).
Ich habe unter Project -> Properties -> Java Build Path -> Libraries den res Ordner hinzugefügt!
 
Ein Element in einem jar ist keine Datei und damit auch nicht über File handhabbar.
Wenn du via File darauf zugreifen musst, musst Du Dir den Inhalt zunächst aus dem jar in z.B. ein tmp Verzeichnis schreiben. Also z.B. den InputStream (getResourceAsStream(...)) lesen und per FileOutputStream rausschreiben. Erst danach kannst Du mit File etwas anfangen.
 
Wenn ich aber nur System.out.print(getClass().getResourceAsStream("/res/xsd/config.xsd")) angebe, bekomme ich null heraus.
 
Hallo,
ich habe eine Jar und in dieser ist das Programm und die Datei. Ich habe ja auch die Dtei im Classpath hinterlegt, aber eclipse findet sie anscheinend nicht.
 
Soll die Anwendung aus Eclipse heraus gestartet werden? Dachte es ginge die um das aufführen eines exportierten JARs? Nur um sicher zu gehen, dass Programm lässt sich bereits aus Eclipse heraus nicht ausführen?
Wie schaut die Package Struktur aus? Hast Du neben den Packages und Klassen für Dein Programm auch ein Package res.xsd in dem sich die Schema Datei befindet?
 
Hallo,
die Anwendung soll zum einen aus eclips aus gestartet werden können und zum anderen aus einer Jar.
Mit dem statement, welches ich eingeführt habe, geht es nicht mehr.
Mit der Jar habe ich es noch nicht probiert. Aber es soll ja in eclipse auch funktionieren.

Die Struktur sieht so aus

Projekt
- src
- lib
- res
 
Hallo,
ja so funktioniert das. Aber sollte es anderst herum nicht auch funktionieren?
 
Hi,

wenn ich mich nicht irre, müsste der Aufruf von Class.getResource() die Resource relative zur Klasse suchen, oder nicht? Beispiel:
Wenn ich die Klasse de.foo.bar.Bazz habe und Bazz.class.getResource("test.txt") ausführe, wird die Datei test.txt im Verzeichnis der Klasse (sprich javatechnisch im package de.foo.bar) gesucht.

Dagegen führt der Aufruf von Class.getClassLoader().getResource() dazu, dass die Resource im Classpath-Root (also im eclipse-java-Project im Verzeichnis src) gesucht wird.

Sprich, dass wichtige ist der Aufruf von getClassLoader().

Gleiches gilt auch für die Methode getResourceAsStream().

Grüße,
Andreas
 
Code:
Class#getResource("test.txt")
relativ zur aufrufenden Klasse
Code:
Class#getResource("/test.txt")
absolut vom der Basis
Abhängig von
Code:
vorangestelltem /
oder
Code:
nicht vorangestelltem /
baut die Methode den absoluten Namen der Resource zusammen und delgiert den Aufruf an den ClassLoader.
 

Neue Themen


Zurück
Oben