Jar-File Start nur über Terminal

WIng2005

Mitglied
Hallo zusammen,

ich habe eine Server-App zur Steuerung von Arduino geschrieben und bisher erfolgreich auf einem Win10-Rechner laufen. Nun habe ich das Ganze auf Linux Mint portiert und stehe vor einem Rätsel:
Die App liest eine Ziel-IP aus einer ini-Datei.
Java:
            Properties props = new Properties();
            FileInputStream in = new FileInputStream("./setup.ini");
            props.load(in);
            in.close();
            String str = props.getProperty("db_ip");

Die ini-Datei liegt im gleichen Verzeichnis. Prinzipiell funktioniert das auch, allerdings nur, wenn ich das JAR-File über das Terminal (java -jar file.jar) starte. Versuche ich das Ganze per Doppelklick im Dateimanager, liest er die ini-Datei nicht aus (File-not-Found-Exception). Hab ich hier einen Denkfehler, oder warum ist das Verhalten unterschiedlich? Ich bin in der Session, wie auch im Terminal als normaler Benutzer unterwegs, nicht als root.

Danke für jeden Tipp..

VG
Steffen
 

WIng2005

Mitglied
Hi,
ich hatte zuvor die Angabe nur über ("setup.ini"), was auch nicht ging (aus der IntelliJ und auf dem bisherigen Win-Rechner läuft es). Herauszufinden ist, was der Unterschied zwischen dem Aufruf per Terminal und dem Aufruf per Gui/Doppelklick ist. Beide starten das eigentliche Java-Programm... nur der Zugriff auf die Datei scheint unterschiedlich geregelt.

VG
Steffen
 

KonradN

Super-Moderator
Mitarbeiter
Also das werden jetzt etwas mehr Punkte...

a) Das eigentliche Problem: Ich meine, dass das Arbeitsverzeichnis immer das System32 Verzeichnis war oder so und nicht das Verzeichnis, in der die JAR Datei ist. Daher kann auf die Datei per ./setup.ini nicht zugegriffen werden.

b) Wenn man Probleme bekommt, dann gibt die Details aus! Also fang Exceptions und gebe diese aus. Dabei ist es egal, ob Du ein Logfile in ein temporäres Verzeichnis schreibst oder ob Du dann ein Dialogfenster öffnest. Wichtig ist, dass Du an die Details heran kommen musst.

c) Generell sollte man auch nicht in Exceptions laufen sondern Dinge vorab prüfen. So kannst Du per Klasse File prüfen, ob es eine Datei "./setup.ini" gibt. Wenn es die nicht gibt, dann kannst Du davon auch den absoluten Pfad mit ausgeben - dann weisst Du auch genau, wo er danach gesucht hat. Das hilft dann auch enorm.

d) Wenn Du den Pfad der JAR Datei brauchst, dann kannst Du den ermitteln. Dazu kannst Du eine Klasse aus der JAR Datei verwenden:
ClassOutOfJar.class.getProtectionDomain().getCodeSource().getLocation().getPath()

Das ist aber eine Methode, die fehl schlagen kann, wenn gewisse Tools verwendet werden, die den Bytecode verbergen sollen (Das Tool jar2exe hat sowas z.B. gemacht).

e) Es ist eine ganz schlechte Idee, Java Programme nur als JAR weiter geben zu wollen. Das ist eine alte Idee, die lange überholt ist. Und noch zu Zeiten, wo Sun und später Oracle an dieser Idee festgehalten haben, gab es dann Massen an Tools um eben diese Problematik zu lösen. launch4j, jar2exe, .... Viele freie und kommerzielle Software Produkte gab es. Und alle hatten gemein, dass man eine Runtime mitgeben konnte. Das ist aber obsolet, da es nun andere Wege gibt wie JPackage oder die Verwendung von GraalVM / NativeImage.

Ja, es bläht ein Paket auf, wenn man eine Runtime mitgibt, aber hier über MB zu meckern wo wir im TB Bereich sind und wir selbst in Deutschland schnelle Internetverbindungen haben, ist aus meiner Sicht falsch. Und wenn es so wichtig ist: Dann ist Java ggf. einfach das falsche Mittel.

f) Und da es um eine setup.ini geht - Baust Du einen Installer selbst? Das ist aus meiner Sicht auch explizit der falsche Weg. Statt dessen sollte man auf die jeweiligen Mittel der Plattform zurückgreifen. Bei Windows ist das ganz klar die Bereitstellung eines MSI, Macs bekommen in der Regel einfach die App in einem DMG aber es kann auch ein pkg kommen und Linux - ja da hat man Kraut und Rüben: deb, rpm, ... Aber selbst da wird man dann vermutlich ein Format wählen, das Distributions-übergreifend ist oder man gibt einfach ein tgz zum entpacken....

Das wären so die Punkte, die mir hier gerade so durch den Kopf gehen würden ...
 

WIng2005

Mitglied
Das hat sich jetzt überschnitten....


Ich habe mir mal den aktuellen Pfad ausgeben lassen.

Java:
String filepath=System.getProperty(user.dir);

Ergebnis:
Terminal: tatsächlicher Ort des JAR- und somit auch des INI-Files -> /Home/User/Schreibtisch/Ordner
Per Gui und Doppelklick: Das User-Root /Home/User

Am liebsten wäre mir ein einfaches öffnen per relativem Pfad, aber es schein, als läuft die Ermittlung des aktuellen Verzeichnisses als Bezugspunkt schon falsch.

VG
Steffen
 

WIng2005

Mitglied
Also das werden jetzt etwas mehr Punkte...

a) Das eigentliche Problem: Ich meine, dass das Arbeitsverzeichnis immer das System32 Verzeichnis war oder so und nicht das Verzeichnis, in der die JAR Datei ist. Daher kann auf die Datei per ./setup.ini nicht zugegriffen werden.

b) Wenn man Probleme bekommt, dann gibt die Details aus! Also fang Exceptions und gebe diese aus. Dabei ist es egal, ob Du ein Logfile in ein temporäres Verzeichnis schreibst oder ob Du dann ein Dialogfenster öffnest. Wichtig ist, dass Du an die Details heran kommen musst.

c) Generell sollte man auch nicht in Exceptions laufen sondern Dinge vorab prüfen. So kannst Du per Klasse File prüfen, ob es eine Datei "./setup.ini" gibt. Wenn es die nicht gibt, dann kannst Du davon auch den absoluten Pfad mit ausgeben - dann weisst Du auch genau, wo er danach gesucht hat. Das hilft dann auch enorm.

d) Wenn Du den Pfad der JAR Datei brauchst, dann kannst Du den ermitteln. Dazu kannst Du eine Klasse aus der JAR Datei verwenden:
ClassOutOfJar.class.getProtectionDomain().getCodeSource().getLocation().getPath()

Das ist aber eine Methode, die fehl schlagen kann, wenn gewisse Tools verwendet werden, die den Bytecode verbergen sollen (Das Tool jar2exe hat sowas z.B. gemacht).

e) Es ist eine ganz schlechte Idee, Java Programme nur als JAR weiter geben zu wollen. Das ist eine alte Idee, die lange überholt ist. Und noch zu Zeiten, wo Sun und später Oracle an dieser Idee festgehalten haben, gab es dann Massen an Tools um eben diese Problematik zu lösen. launch4j, jar2exe, .... Viele freie und kommerzielle Software Produkte gab es. Und alle hatten gemein, dass man eine Runtime mitgeben konnte. Das ist aber obsolet, da es nun andere Wege gibt wie JPackage oder die Verwendung von GraalVM / NativeImage.

Ja, es bläht ein Paket auf, wenn man eine Runtime mitgibt, aber hier über MB zu meckern wo wir im TB Bereich sind und wir selbst in Deutschland schnelle Internetverbindungen haben, ist aus meiner Sicht falsch. Und wenn es so wichtig ist: Dann ist Java ggf. einfach das falsche Mittel.

f) Und da es um eine setup.ini geht - Baust Du einen Installer selbst? Das ist aus meiner Sicht auch explizit der falsche Weg. Statt dessen sollte man auf die jeweiligen Mittel der Plattform zurückgreifen. Bei Windows ist das ganz klar die Bereitstellung eines MSI, Macs bekommen in der Regel einfach die App in einem DMG aber es kann auch ein pkg kommen und Linux - ja da hat man Kraut und Rüben: deb, rpm, ... Aber selbst da wird man dann vermutlich ein Format wählen, das Distributions-übergreifend ist oder man gibt einfach ein tgz zum entpacken....

Das wären so die Punkte, die mir hier gerade so durch den Kopf gehen würden ...
Hi und danke für die Antwort. Mal zur Erklärung: das Programm ist exakt 1x im Umlauf...und das bei mir auf dem Server. Manuelles Übertragen des JAR- und INI-Files sind hier nicht das Problem. Das ganze läuft unter Linux (Mint 21).
Fehler bei der Ermittlung der DB-IP wir in einem Try-Catch Block abgefangen und der Fehler ausgegeben : File-not-Found-Exception.
Mich wundert nur, dass 2 Wege, die gleiche Datei zu starten, zu unterschiedlichen Ergebnissen führen.

VG
Steffen
 

KonradN

Super-Moderator
Mitarbeiter
Also bist Du nicht unter Windows sondern auf einem Mac unterwegs :)
Hast Ja Linux MInt geschrieben ... das /Home hatte mich irritiert. Der große Anfangsbuchstabe war irritierend .. Bei Macs ist es /Users/ und nicht /home ...

Und da geht es ja um das Arbeitsverzeichnis - und das ist - je nachdem, wie Du etwas startest, immer anders. Beim Terminal gibst Du es ja vor aber das kann da dann auch jedes Verzeichnis sein.

Bei so Dateien ist immer die Frage: Wer ändert die denn wann? Wenn der User das ändern können soll, dann ist es üblich, sowas im Home Verzeichnis zu plazieren. Also z.B. als .myapp.ini oder so. (myapp dann natürlich der Name Deiner App). Da hast Du dann Zugriff drauf.
Der Zugriff erfolgt dann über die Property user.home.

Das behebt dann so Probleme komplett. Denn auch auf dem Terminal kann das Arbeitsverzeichnis ja woanders sein...

Edit: Hatte zwischen Fenstern umschalten müssen und dann hatte er beim zurück wechseln irgendwie den Fokus falsch und hat es vorzeitig abgesendet.
 

WIng2005

Mitglied
Hi Konrad,
entwickeln tue ich auf meinem MAC, der erste Server war Windows. Weil dieses aber permanent updatet und neustartet (geht leider nicht zu deaktivieren), habe ich auf einen Linux-Mint portiert. Dort liegt die App und die ini aktuell auf dem Schreibtisch in einem Ordner. Via Terminal starte ich also das gleiche, was ich per Klick in der Gui starte. Trotzdem gibt mit System.getProperty(user.dir) einmal den Ordner auf dem Schreibtisch und einmal den UserRoot aus. Das verstehe ich nicht.
Es schein also, als wenn java -jar filename das ganze ins aktuelle Verzeichnis übersetzt, der Doppelklick als executable es zwischenparkt...

VG
Steffen
 
Zuletzt bearbeitet:

KonradN

Super-Moderator
Mitarbeiter
Der Unterschied kommt ja einfach von der Art und Weise, wie etwas gestartet wird. Wenn Du im Terminal bist, dann hast Du da ein definiertes Arbeitsverzeichnis. Bei dem Doppelklick hast Du das aber erst einmal nicht. Durch den Doppelklick wird ja von dem Desktop Environment die Auswertung gemacht und dann kommt ein Aufruf. Und der Aufruf sieht dann etwas vor a.la. "java -jar vollerPfadMitJarDatei" - nur eben wird das vom Desktop Environment ausgeführt und das hat dann irgend ein Arbeitsverzeichnis. Man kann hier diskutieren, ob es Sinn machen würde, dass dies das Verzeichnis der Datei ist, aber das ist bei vielen Umgebungen meines Wissens nach nicht so.

Was Ich hier machen würde (Du willst ja nichts weitergeben sondern nur selbst nutzen): Pack alles an einen Ort, den Du gut findest (z.B. ~/bin/myapp/ - das ist so das Pattern, das ich auf Unix Systemen nutze), in ~/bin habe ich dann in der Regel ein Shell-Script, das den Start macht. Dann kann ich sowas auf der Kommandozeile starten. Und in der Desktop Umgebung erstelle ich einfach ein Shortcut. Damit landet es dann in den Menüs oder man kann es auf dem Desktop plazieren und so ....

Das wäre ein möglicher Ansatz ohne dann an der Anwendung selbst etwas ändern zu müssen. Die anderen Wege sind natürlich alle auch super und aus meiner Sicht bessere Wege, aber wenn Du alleine alles nutzen willst, dann dürfte es schlicht Overkill sein. Daher die Idee dieses Workarounds.
 

WIng2005

Mitglied
Hi Konrad,
ich fürchte hier bin ich nicht wissend genug zu... wenngleich ich via google schon einiges rausgefunden habe:
Mein Tool liegt jetzt unter/opt/tool. Das shellscript liegt unter /usr/local/bin (soweit aus dem Ubuntu-Forum unter OPT gefunden):
Java:
#!/bin/sh
cd /opt/tool/
    java .jar file.jar

Wie bekomme ich das jetzt als Starter aufs Desktop?

VG
Steffen
 

KonradN

Super-Moderator
Mitarbeiter
Also erst einmal muss es -jar und nicht .jar sein ... aber das wird wohl ein Fehler sein bei der Übertragung ins Forum sein, denn Du hast das ja bestimmt getestet.

Welchen Desktop verwendest Du denn? Evtl. reicht es, einen Softlink auf das Script in Desktop zu erstellen.

Teilweise werden .desktop Dateien verwendet für z.B. Menu Einträge und so. Die können auch auf dem Desktop plaziert werden. Das sind Text-Dateien mit einem Inhalt wie:
Code:
[Desktop Entry]
Type=Application
Name=MeineApp
Exec=/pfad/zur/ausfuehrbarenDatei
Icon=/pfad/zum/icon.png
Categories=Utility;
 

WIng2005

Mitglied
Hallo Konrad,

was soll ich sagen..... geht... perfekt! Vielen Dank für deine Unterstützung.

Was ich jetzt habe (und korrigiert mich, falls die Pfade singfrei sind-> alles ergoogelt und auf Basis von Halbwissen)

Die Anwendung liegt jetzt im Ordner: /opt/Tool/file

Im Ordner /usr/local/bin/ liegt ein Script:

Java:
#!/bin/sh
cd /opt/tool/
java -jar file.jar

Ausführbar gemacht (chmod +x)

Dann Starter.desktop wie oben beschrieben...... läuft.

VG
Steffen
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
R 11 GB File lesen ohne zu extrahieren Filedaten Bereich für Bereich adressieren dann mit Multi-Thread id die DB importieren Allgemeine Java-Themen 3
D Read JSON File Problem Allgemeine Java-Themen 9
S Umstellung von File auf Path - Probleme mit Stream Allgemeine Java-Themen 5
C jar File mehrfach aufrufen (als Windows Dienst) Allgemeine Java-Themen 5
N File Path mit Variablen angeben Allgemeine Java-Themen 1
izoards Zugriff auf gemeinsame Ressource (CSV-File) Allgemeine Java-Themen 3
S Class File Editor -> Source not found Allgemeine Java-Themen 4
F jar File ausführen Allgemeine Java-Themen 14
M File Binary Representation Allgemeine Java-Themen 1
N jar File auf Mac mit Doppelklick starten Allgemeine Java-Themen 5
O Input/Output java.io.File beenden Allgemeine Java-Themen 5
G File not found - nach dem Kompilieren Allgemeine Java-Themen 6
T Jar File zu exe... Allgemeine Java-Themen 3
M Foreign Memory API / Memory-Mapped File Allgemeine Java-Themen 0
R Delete files before creating new from temp using Java file method Allgemeine Java-Themen 1
S File lesen und schreiben Java 6 Allgemeine Java-Themen 2
T String-Manipulation beim Ablauf in Eclipse und als JAR-File Allgemeine Java-Themen 8
F Input/Output FileNotFoundException, obwohl File existiert Allgemeine Java-Themen 5
G Excel File öffnen, in Zelle schreiben, abspeichern Allgemeine Java-Themen 6
L JAR-File auf Ilias (LMS) laufen lassen Allgemeine Java-Themen 0
ralfb1105 Classpath Directory fuer Properties File Allgemeine Java-Themen 2
L File beim Kopieren in einen anderen Ordner umbenennen Allgemeine Java-Themen 6
J File in Package erstellen & lesen mit Programmstart in externe Projekt Allgemeine Java-Themen 3
I File ausführen und mein Programm bearbeiten lassen Allgemeine Java-Themen 11
A File lesen Codierung Charset Allgemeine Java-Themen 5
J .java-Dateitext Compile zur Laufzeit ohne File Allgemeine Java-Themen 15
M Key-File im selben Ordner speichern? Allgemeine Java-Themen 18
I TrueZip add file to archive Allgemeine Java-Themen 10
T Probleme mit dem Pfad zum Propertie file Allgemeine Java-Themen 7
J ftp - delete file ohne appache Allgemeine Java-Themen 8
X Klassen File-Klasse wird als Directory markiert Allgemeine Java-Themen 8
T ImageIO.read -> Can`t read input file Allgemeine Java-Themen 11
L Applet Problem "security: Trusted libraries list file not found" ? Allgemeine Java-Themen 7
C Swing File[] als klickbare links in irgendeinem Swing Element Allgemeine Java-Themen 3
H Kennt sich jemand mit Eclipse und dem Thema Jar-File aus ? Allgemeine Java-Themen 6
H Laden einer (Resourcendatei) aus einem Jar-File Allgemeine Java-Themen 17
C Authentifizierung mit java.nio.file? Allgemeine Java-Themen 5
L CSV File lesen, in ArrayList speichern und ausgeben Allgemeine Java-Themen 3
M xlsx File auslesen Exception occured Allgemeine Java-Themen 13
offi Drag and Drop mehrerer File aus Explorer in JTable Allgemeine Java-Themen 1
G Java/LibGDX File Loading Exception Allgemeine Java-Themen 2
Cromewell JavaFX FXML-File lädt unter Ubuntu nicht Allgemeine Java-Themen 7
D Java Anwendung mit dll File Allgemeine Java-Themen 5
AssELAss Log4j Logging Ausgabe für jede Klasse in seperates File Allgemeine Java-Themen 2
thet1983 Input/Output read properties file from classpath Allgemeine Java-Themen 3
J Umwandeln von URL zu File und danach kopieren geht nicht Allgemeine Java-Themen 1
J Properties file ändern Allgemeine Java-Themen 12
S Executable Jar File startet nicht unter Windows 10 Allgemeine Java-Themen 3
B Objekte anhand von Properties file Allgemeine Java-Themen 41
Dechasa Input/Output Write into File Allgemeine Java-Themen 2
N Maven ObjectMapper Error wenn das File gespeichert wird Allgemeine Java-Themen 0
H Security Manager (IIOException: Can't read input file!) Allgemeine Java-Themen 2
H File.listFiles() funktioniert nicht... Allgemeine Java-Themen 10
C Input/Output Problem bei Datei verschiebung mit File.move und Paths.get() Allgemeine Java-Themen 26
X Zeile unter einer bestimmen Zeile hinzufügen(File) Allgemeine Java-Themen 1
F Open source file übersetzen Phython -> Java Allgemeine Java-Themen 4
C file.delete() funktioniert bei zweiten aufruf nicht mehr Allgemeine Java-Themen 3
M Desktop jar File icon Ändern? Allgemeine Java-Themen 14
O Sax-Parser ließt XML-File doppelt Allgemeine Java-Themen 1
J Java Software Compare Files und Neue File erstellen Allgemeine Java-Themen 0
Thallius Custom File Chooser Allgemeine Java-Themen 1
C .jar File lässt sich nur über Konsole öffnen Allgemeine Java-Themen 1
J Java Download Filedownload File.getFileName Allgemeine Java-Themen 3
R Java .class-File-Konstrunkt mit Programm visualisieren Allgemeine Java-Themen 18
G SecurityManager/Policy-File/Reflection Allgemeine Java-Themen 0
M pdf File bzw. ausgefüllte pdf Formulare drucken Allgemeine Java-Themen 2
S Input/Output File Not Found FileReader Allgemeine Java-Themen 6
Thallius Serialisiertes File kann auf anderem Rechner nicht geladen werden Allgemeine Java-Themen 12
P Java Dynamic Web Project -> config File Allgemeine Java-Themen 1
S runnable jar file in Verbindung mit itext Allgemeine Java-Themen 3
D Variablen java.io.File zum vergleichen abspeichern Allgemeine Java-Themen 1
M File IO Klasse ... wie einbinden Allgemeine Java-Themen 6
O Freies Tool zum Jar-File obfuscaten gesucht! Allgemeine Java-Themen 5
F File.listFiles ohne .sort Allgemeine Java-Themen 6
B XML File JAXB Allgemeine Java-Themen 0
S Platzverbrauch, File oder String Allgemeine Java-Themen 14
J Runnable jar-File: Fehlermeldung Allgemeine Java-Themen 2
P Kurze Frage: aus einer File die Zeilenanzahl auslesen Allgemeine Java-Themen 9
K Gepacktes Jar-File gibt beim Doppelklick eine Exception aus Allgemeine Java-Themen 4
P java.nio.file unter Java 6 verwenden Allgemeine Java-Themen 4
A TXT File einlesen unterschiedliche Zeilenlänge Allgemeine Java-Themen 9
B Finde letztes veränderte File Allgemeine Java-Themen 4
E Zip-File entpacken: unterschiedlicher Zeitaufwand bei unterschiedlicher Puffergröße Allgemeine Java-Themen 2
Guybrush Threepwood File.canWrite() und UAC Allgemeine Java-Themen 7
N Input/Output Mit Windows 7 erzeugtes zip-File in Java 7 öffnen Allgemeine Java-Themen 5
B Garbage Collection Logfile: Binary File Allgemeine Java-Themen 2
H XML-File mit Java erzeugt Frage Allgemeine Java-Themen 10
V C-Header Datei aus .java File herstellen Allgemeine Java-Themen 10
D File mit Inhalt kopieren und dieses File dann neu erstellen ? Allgemeine Java-Themen 4
T @NotBlank verwendet nicht message aus .property-File Allgemeine Java-Themen 4
G Jar-File soll eignen *.jar Namen ausgeben Allgemeine Java-Themen 10
S Jar-File startet nicht über doppelklick Allgemeine Java-Themen 2
P ganze Zeilen in einem File mit .replace() ändern. Allgemeine Java-Themen 10
S Datei in File-Objekt mit UTF-8 einlesen Allgemeine Java-Themen 2
P Aus einem File Zeilen auslesen. Allgemeine Java-Themen 15
V ProcessBuilder exe file Allgemeine Java-Themen 3
L Variablen IO Exception weil File angeblich nicht exisitert Allgemeine Java-Themen 10
M File einlesen während es beschrieben wird.. Allgemeine Java-Themen 6
B File umbennen ohne Extension zu aendern Allgemeine Java-Themen 2
Wirago (runnable) JAR-File ausführen Allgemeine Java-Themen 6

Ähnliche Java Themen

Neue Themen


Oben