Dateien aus einem Jar heraus anlegen

martingallee

Grünschnabel
Liebe Java-Experten,

ich habe ein paar grundsätzliche Fragen zum Thema jar, über die ich mir jetzt schon ziemlich lange den Kopf zerbreche. Es gibt zwar über das Thema allgemein erfreulich viel an Material, aber das, um was es mir geht, ist irgendwie bisher nicht dabei gewesen.

Ich habe ein Java-Programm als jar auf eine CD-ROM gepackt und starte das Ganze mit einer Batch-Datei (und Autostart unter Windows). Das funktioniert auch soweit. Aber...

Während des Programmablaufs soll der Benutzer die Möglichkeit bekommen, bestimmte Daten in einer Datei zu speichern (Spielstände, Bestenliste etc.), die dann auch dauerhaft auf der Festplatte steht. Unter Eclipse klappt das auch, ich schreibe die relevanten Daten zunächst in ein Objekt und serialisiere dieses dann in eine ".ser"-Datei. Das Problem ist nun aber, dass sich auf der CD-ROM ja nur ein jar befindet, und in diesem weiteren Zusammenhang habe ich nun folgende Fragen:

- Was genau passiert, wenn das .jar von der CD-ROM gestartet wird? Extrahiert der Klassenlader die ".class"-Dateien einfach und führt sie ohne weitere Umschweife aus? Oder wird irgendwo auf der Festplatte so etwas wie ein Ausführungsverzeichnis angelegt, in dem sich dann auch zum Beispiel eine Datei mit Spielständen sinnvoll anlegen ließe? Wenn etwas auf der Festplatte angelegt wird - ist das dann eine Kopie des jars von der CD-ROM oder eine entpackte Version? Die Frage ist für mich (außer bloßem Interesse) deshalb wichtig, weil sich der Umgang mit Streams ja im Falle eines jars anders gestaltet als bei nicht komprimierten Programmen. Falls beim Ausführen nichts auf der Festplatte angelegt wird - gibt es zur Laufzeit eine Möglichkeit (z.B. ein System Property), um einen geeigneten Ort für das Speichern einer solchen Datei herauszufinden?

- Das mit den Pfadangaben auf der Suche nach Ressourcen ist wohl ein oft gehörtes Problem. Ich verstehe, dass in jars nur per "getResource()" nach Ressourcen gesucht werden kann und habe das Programm entsprechend angepasst. Ziemlich verwirrt bin ich nun aber bezüglich der Frage, ob die Pfadangaben in der Entwurfsversion in Eclipse grundsätzlich anders sein müssen als letztlich im jar. Für Letzteres sehe ich immer wieder Pfadangaben mit einem vorangestellten "/", weiß aber nicht, warum. Gibt es also die Möglichkeit in Eclipse eine Version zu erstellen und die dann unverändert in ein jar zu packen, oder muss ich vor dem Packen erst noch an den Pfadangaben etwas verändern?

Für Eure Aufmerksamkeit und Hilfe schon an dieser Stelle herzlichen Dank. Wenn Ihr eine Quelle wisst (gerne auch ein Buch), wo ich mich (wie etwa auf der sun-Page) grundsätzlich über solche jar-Bezogenen Fragen informieren kann, wäre das auch sehr hilfreich.

Alles Gute,

Martin
 
Also ich habe früher auch immer Probleme mit Ressourcen gehabt weil eclipse diese nicht ohne weiteres zu den kompilierten Class-Files gelegt hat und man sie somit immer nicht laden konnte.

Die Pfade müssen eigentlich nicht anders aussehen, sofern die Struktur innerhalb des Jars mit der der kompilierten Dateien übereinstimmt.

Mit Maven kann man das alles wunderbar organisieren. Hast du damit mal gearbeitet?

Es gibt ein paar Properties die in Java immer vorhanden sind. Diese sind unter System.getProperties gelistet. Es bietet sich z.B. user.home an.
 
Hallo zeja,

vielen Dank für Deine schnelle Antwort. Ich werde mir Maven mal anschauen und mich dann wieder melden.

Das Problem, das ich mit den Properties habe, ist, dass die ja - sozusagen - kontextsensitiv sind, d.h. "user.dir" ist beim ersten Aufruf möglicherweise anders als beim zweiten. Wenn ich aber außerhalb des jar eine Datei anlegen möchte, die dort erstens bleibt und zweitens auch wieder vom Programm gefunden werden kann, weiß ich nicht, ob das mit den Properties so ohne Weiteres möglich ist. Aber auch das werde ich mal ausprobiere. Wie gesagt - vielen Dank.

Bis dahin,

Martin
 
Hallo!
Vielleicht solltest du dir mal die Preferences API anschauen, damit kann man unabhängig vom Betriebssystem Einstellungen mit Mitteln des Betriebssystems persistent machen.
mfg flo
 
Ja das wäre auch ne Möglichkeit. Beim ersten mal ein Verzeichnis in user.home anlegen (nicht user.dir!) und dann im Betriebssystem speichern wo der Ordner liegt. Auch wenn sich user.home nicht gerade oft ändert.
 
Zurück