• Wir präsentieren Dir heute ein Stellenangebot für einen Java Entwickler - m/w/d in Augsburg, München, Stuttgart oder Bamberg. Hier geht es zur Jobanzeige

Javapackager working directory on Mac

D

dvid85

Aktives Mitglied
Hi,
ich hatte mal vor Jahren eine Java-Swing GUI mit dem Jarbundler von Apple gepacked und ging auch gut.

Der neue Default-Weg um eine .app zu erstellen ist wohl der Javapackager. Hat auch funktioniert, aber die relativen Pfade stimmen nicht.

Auf dem Mac ist eine App wie ein Ordner aufgebaut: AppOrdner/Name.app/Contents/Java/meinProgramm.jar

Ich hatte in dem Programm alle Pfade relativ definiert. Mit dem Jarbundler hatte es wunderbar funktioniert, dass z.B. newFile('Resource/file.txt') auf den Ordner AppOrdner/Resource verweist. Resource war also außerhalb der App.

Wenn ich die jar mit dem Javapackager deploye, referenziert der newFile() Befehl aber in den App Ordner auf AppOrdner/Name.app/Contents/Java/Resource.

Leider referenzieren leider ziemlich viele Befehle im Java Programm hartkodiert auf solche Ordner, die außerhalb der App liegen sollen.

Wie bekomme ich es hin, dass newFile('Resource/file.txt') wieder auf einfache Weise und defaultmäßig auf AppOrdner/Resource referenziert?

Meine Ideen wären,
(1) dass man den javapackager so konfigurieren kann,
(2) oder dass man in Java das default working directory setzen kann, sodass man mittels new File("") außerhalb der App landet und nicht im Ordner der .jar

Für beides habe ich allerdings keine Lösung gefunden. Bitte um Hilfe. Danke.
 
kneitzel

kneitzel

Top Contributor
Mein Tipp: Stell das so um, dass du die Elemente als Ressource einbindest! Also die Dateien entsprechend einbinden und dann mittels getClass().getResource("/file.txt") oder getClass().getResourceAsStream("/file.txt") darauf zugreifen.

Das wäre der Standard um auf Dateien zuzugreifen, die im Programm mitgegeben werden sollen ... Oder kommt das aus irgendwelchen Gründen nicht in Frage?
 
L

LimDul

Top Contributor
Auch wenn du es nicht hören willst vermutlich - am sinnvollsten ist es die Resourcen in das Jar File zu packen und per getResourceAsStream zu referenzieren - also aus dem Class-Path laden.
 
mrBrown

mrBrown

Super-Moderator
Mitarbeiter
BTW, der richtige Weg dafür ist jpackage (in ein paar Wochen ganz offiziell, lässt sich aber schon seit längerem problemlos nutzen), Javapackager ist nicht mehr wirklich supported.
 
D

dvid85

Aktives Mitglied
Alle Ressourcen, die zum Programm gehören sind bereits in der Jar. Es geht eher um externe Ordner, in denen u.a. Programmeinstellungen gespeichert werden. Daher sollten diese Ordner nicht innerhalb der App entstehen. (Ja, ist auch nicht ganz Mac-konform, dass diese Ordner neben der App-Datei liegen, aber fand ich damals übersichtlich und praktikabel.)

Es wäre jetzt für mich am einfachsten, wenn newFile("ordner") einfach wieder auf einen Ordner zeigt, der im Ordner der App liegt und nicht neben der Jar Datei irgendwo innerhalb der App. Ggf. indem man das working directory dorthin legt. Geht das?

Ich könnte in Java natürlich die Pfade auf sowas wie ".../.../.../ordner" ändern um in dem Ordner der App-Datei zu landen, aber das kommt mir auch irgendwie dirty vor.

Dieses Verhalten des javapackagers, dass die Pfade nach dem packen relativ zur jar Datei bleiben, ist doch ziemlich unsinnig. Eigentlich müsste man das konfigurieren können, aber habe dazu nichts gefunden.

Bei jpackage steht, dass es auf javapackager beruht 🤷🏼‍♂️
 
Zuletzt bearbeitet:
mrBrown

mrBrown

Super-Moderator
Mitarbeiter
Ganz generell sollte man nie davon ausgehen, dass die Anwendung selbst im aktuellen Arbeitsverzeichnis liegt oder dass über die GUI gestartete Anwendungen überhaupt ein sinnvolles Arbeitsverzeichnis haben.

Am sinnvollsten und einfachsten dürfte es sein, einen extra Ordner im Home-Verzeichnis dafür zu nutzen – der lässt sich zumindest aus Java-Programmen heraus immer gleich erreichen, unabhängig von Java-Version, Packaging und OS-Version.


Sowohl das, was Jarbundler offensichtlich gemacht hat als auch das, was javapackager macht, entspricht beides auch nicht den Konventionen unter macOS.

Bei jpackage steht, dass es auf javapackager beruht 🤷🏼‍♂️
Trotzdem: javapackager war nie offizieller Teil des JDKs und ist seit Jahren auch nicht mehr Teil des Oracle-JDKs und wird auch nicht mehr entwickelt. Grade deshalb gibt es jetzt jpackage, was dann offiziell und supported ist – das es auf javapackager beruht bedeutet nicht viel, einiges wird dort anders gemacht.
Jetzt auf javapackager umzusteigen ist in bisschen wie jetzt von Windows 2000 auf Windows XP umsteigen, weil 2000 "alt ist" ;)
 
kneitzel

kneitzel

Top Contributor
Also man kann ja mit Syatem.getProperty sich user.home holen und im Home Verzeichnis Dinge hinterlegen.
Das ist ja so auf dem Mac auch so üblich - ebenso wie bei Unix Systemen.

Bei Windows ist das anders, Prinzipiell funktioniert der obere Weg auch, aber da wäre die Umgebungsvariablen APPDATA die Grundlage....
 
D

dvid85

Aktives Mitglied
Ich habe gerade mal System.setProperty( "user.dir", "/path/to/dir" ) ausprobiert. Dann landet new File("") in dem spezifizierten Ordner. Das könnte klappen, wenn ich nicht noch etwas übersehe. Ansonsten muss ich mir nochmal überlegen, ob ich wirklich dabei bleiben will, die Dateien neben der App zu speichern. Ganz sauber ist das auch nicht, aber es vereinfacht einen Umzug auf einen anderen Rechner. Das war für mich damals ausschlaggebend.
 

Ähnliche Java Themen

Anzeige

Neue Themen


Oben