JAR, Pfad und Properties

C

Camino

Gast
Hallo,

ich hänge da nun schon seit einiger Zeit an einem Problem und bräuchte mal Hilfe.

Und zwar hab ich eine Swing-Anwendung, die ich über Eclipse zu einem ausführbaren JAR erstellen lasse. Als Ergebnis erhalte ich in einem festgelegten Ordner eine JAR-Datei und ein Ordner mit den benötigten LIBs. Für meine Anwendung brauche ich auch eine Properties-Datei, welche ausserhalb der JAR (aber im gleichen Ordner) liegt, da ich dort während der Programmausführung sowohl lesen als auch schreiben möchte. Das Erstellen der JAR-Datei klappt soweit ganz gut, nur hab ich wohl noch Probleme mit dem Pfad zur Properties-Datei. Ich hab das mal getestet, indem ich zu Programmstart eine Properties-Datei speicher. Die Properties-Datei ist noch nicht vorhanden, wird also neu erstellt.

Wenn ich mit einem Doppelklick auf die JAR-Datei die Anwendung starte, wird die Properties-Datei in mein home-Verzeichnis geschrieben (ich arbeite mit Debian Linux). Wenn ich die JAR-Datei über die Konsole ausführe, also im Verzeichnis, wo die JAR liegt,
Code:
java -jar datei.jar
eingebe, dann wird die Properties-Datei in den Ordner mit der JAR und dem LIB-Ordner geschrieben, so wie ich es haben möchte.

In meiner Anwendung speicher ich die Properties so ab:
Java:
	// Properties in Datei speichern
	public void saveProperties( Properties props ) {
		
		try {
			FileOutputStream propOutFile = new FileOutputStream( "user.conf" );
			props.store( propOutFile, "Lokale Einstellungen für Anwendung" );
		}
		catch ( FileNotFoundException ex ) {
			System.err.println( "Can't find " + propFile );
		}
		catch ( IOException ex ) {
			ex.printStackTrace();
		}
		
	}
Ich hab auch schon beim Dateinamen
Code:
./user.conf
probiert, klappt aber auch nicht. Hab ich einen Fehler bei der Pfadangabe? Liegt der Fehler in der Methode zum Schreiben der Properties? Oder liegt es an der Manifest-Datei:
Java:
Manifest-Version: 1.0
Class-Path: . semtix_lib/truezip-6.8.jar semtix_lib/postgresql-8.4-701.jdbc4.jar
Main-Class: main.Semtix
// -----LEERZEILE-----
Bin schon seit einigen Tagen am suchen und probieren, aber es klappt irgendwie nicht. Vielleicht kann mir ja jemand weiterhelfen...

Gruss
Camino
 

nrg

Top Contributor
probiers mal mit classloader.
ungetestet:
Java:
	public void saveProperties(Properties props) throws IOException {
		URL config = ClassLoader.getSystemClassLoader().getResource("user.conf");
		if (config == null)
			throw new FileNotFoundException("user.conf konnte nicht gefunden werden");

		props.store(new FileOutputStream(config.getFile()), "Lokale Einstellungen für Anwendung");
	}

edit: hatte mich vertippt ^^
 
Zuletzt bearbeitet:
C

Camino

Gast
Java:
config = null
java.io.FileNotFoundException: user.conf konnte nicht gefunden werden
 

nrg

Top Contributor
dann konnte die datei nicht gefunden werden :). testest du das gerade in der IDE oder mit der JAR? wo liegt denn die Datei?
 
C

Camino

Gast
Hatte das gerade mit Eclipse getestet. Die Datei user.conf liegt im Workspace auf der gleichen Ebene wie meine src-Verzeichnis.
Mit meiner vorherigen Methode wurde die Datei so gefunden und konnte auch gelesen und geschrieben werden. Nur mit dem JAR gab es da die Probleme...
 
Zuletzt bearbeitet von einem Moderator:
C

Camino

Gast
Dann bekomme ich mit Eclipse diese Meldung:
Java:
config = file:/home/heyho/Semtix/Java%20workspace/Semtix/bin/user.conf
java.io.FileNotFoundException: /home/heyho/Semtix/Java%20workspace/Semtix/bin/user.conf (No such file or directory)
 

nrg

Top Contributor
sieht mir nach einem encoding-problem mit leerzeichen aus. ich habs jetzt auch mal getestet. funktionierte nur hatte ich keine leerzeichen im pfad :). ich teste das nochmal, mom

probiers mal so:


Java:
	public static void saveProperties(Properties props) throws IOException, URISyntaxException {
		URL config = ClassLoader.getSystemClassLoader().getResource("user.conf");
		if (config == null)
			throw new FileNotFoundException("user.conf konnte nicht gefunden werden");
		props.store(new FileOutputStream(config.toURI().getPath()), "Lokale Einstellungen für Anwendung");
	}

damit sollte es aber funktionieren. die URISE kannste imho auch ignorieren.
 
Zuletzt bearbeitet:

FArt

Top Contributor
Classloader funktioniert nur, wenn die Datei nur gelesen werden soll.
Zum Schreiben wird immer das aktuelle Verzeichnis genommen. Das kannst du aber nicht festlegen.

Der saubere Weg: schreibe die Properties immer in das Userverzeichnis und nutze zum Ermitteln dieses Verzeichnisses das Systemproperty.
Der unsaubere Weg: lade eine Klasse aus deinem JAR, lass dir den kompletten Pfad zu der Ressource geben, parse den Pfad und schon weißt du, wo das JAR liegt.

Ich empfehle grundsätzlich den Weg, der sich nicht wie ein Hack anfühlt.
 

nrg

Top Contributor
warum? geht doch..

nachdem user.conf nach einer benutzerconfig aussieht, könnte man aber wirklich
Code:
..getProperty("user.dir")
nehmen.
 
C

Camino

Gast
Classloader funktioniert nur, wenn die Datei nur gelesen werden soll.
Zum Schreiben wird immer das aktuelle Verzeichnis genommen. Das kannst du aber nicht festlegen.
Was heisst "aktuelles Verzeichnis"? Dort, wo auch die Anwendung liegt und ausgeführt wird? Oder das User-Verzeichnis? Weil, wie ich oben geschrieben hatte, wird die Datei unterschiedlich angelegt: wenn ich die JAR-Datei über die Konsole starte, landet die Datei im Verzeichnis neben dem JAR. Wenn ich die Anwendung mit Doppelklick starte, landet die Datei im home-Verzeichnis.

Der saubere Weg: schreibe die Properties immer in das Userverzeichnis und nutze zum Ermitteln dieses Verzeichnisses das Systemproperty. Der unsaubere Weg: lade eine Klasse aus deinem JAR, lass dir den kompletten Pfad zu der Ressource geben, parse den Pfad und schon weißt du, wo das JAR liegt.
OK, muss ich mir mal überlegen, was mir lieber ist...
 
C

Camino

Gast
warum? geht doch..
Na ja, wenn (wie FArt schrieb) mit dem ClassLoader nur gelesen werden kann... Ich möchte in die Datei ja auch schreiben können.

nachdem user.conf nach einer benutzerconfig aussieht, könnte man aber wirklich
Code:
..getProperty("user.dir")
nehmen.
In meiner user.conf sollen einfach lokale Einstellungen für jeden einzelnen Benutzer drin stehen. Mit getProperty("user.dir") bekomme ich dann den Pfad zu dem Verzeichnis, in dem die JAR (und auch die user.conf) drinliegen? Das wäre ja eigentlich das, was ich bräuchte...
 

FArt

Top Contributor
Was heisst "aktuelles Verzeichnis"? Dort, wo auch die Anwendung liegt und ausgeführt wird?
Das aktuelle Verzeichnis ist das, aus dem die Anwendung gestartet wurde. Das mag häufig das Verzeichnis sein, in dem die Anwendung liegt, muss es aber nicht. Das sieht man schon daran, dass du bei deinen zwei Usecases unterschiedliches Verhalten erzeugst.
 

FArt

Top Contributor
Na ja, wenn (wie FArt schrieb) mit dem ClassLoader nur gelesen werden kann... Ich möchte in die Datei ja auch schreiben können.


In meiner user.conf sollen einfach lokale Einstellungen für jeden einzelnen Benutzer drin stehen. Mit getProperty("user.dir") bekomme ich dann den Pfad zu dem Verzeichnis, in dem die JAR (und auch die user.conf) drinliegen? Das wäre ja eigentlich das, was ich bräuchte...

Der Anforderung nach wäre alles andere sogar falsch. Wenn die Applikation auf einem Rechner installiert wird und sie unter verschiedenen Usern gestartet werden kann, wird ein User erwarten, dass seine Konfiguration nicht global verwendet wird oder verändert wird.

Mein Tipp bei so was: die Defaulteinstellungen im JAR ausliefern und aus dem Klassenpfad lesen, die persönlichen Einstellungen im Benutzerverzeichnis speichern. Suchreihenfolge: erst Einstellungen aus dem Benutzerverzeichnis.
 

nrg

Top Contributor
naja gut, klär mich auf. ich habe bis jetzt in meinen projekten auch nur properties über den classloader geladen. warum spricht was gegen speichern? ich bin jetzt in o.g. code auch fälschlicherweiße davon ausgegangen, dass die properties datei existieren muss. nachdem das nicht immer der Fall ist, könnte man den code aber auch einfach umschreiben:

Java:
	public static void saveProperties(Properties props) throws IOException, URISyntaxException {
		URL config = ClassLoader.getSystemClassLoader().getResource(".");
		props.store(new FileOutputStream(config.toURI().getPath() + File.separator + "user.conf"), "Lokale Einstellungen für Anwendung");
	}

wüsste jetzt nicht, was dagegen spräche.

edit: aber nachdem das anscheinend benutzerbezogene einstellungen sind, eignet sich wohl user.dir eher dafür.
 
Zuletzt bearbeitet:
C

Camino

Gast
Der Anforderung nach wäre alles andere sogar falsch. Wenn die Applikation auf einem Rechner installiert wird und sie unter verschiedenen Usern gestartet werden kann, wird ein User erwarten, dass seine Konfiguration nicht global verwendet wird oder verändert wird.

Mein Tipp bei so was: die Defaulteinstellungen im JAR ausliefern und aus dem Klassenpfad lesen, die persönlichen Einstellungen im Benutzerverzeichnis speichern. Suchreihenfolge: erst Einstellungen aus dem Benutzerverzeichnis.
OK, werde das wohl dann so umsetzen.

Ich danke euch beiden für eure Hilfe...

Camino
 

FArt

Top Contributor
wüsste jetzt nicht, was dagegen spräche.

Abhängig von der Laufzeitumgebung kann es passieren, dass die URL des Classloaders nicht in eine gültige URI für Zugriffe auf das Filesystem konvertiert werden kann.
Unabhängig davon kann es sein, dass der ausführende Benutzer gar keine Schreibrechte auf das Verzeichnis hat, in dem die Applikation liegt.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
kodela String kann nicht zu Pfad konvertiert werden Allgemeine Java-Themen 16
izoards Java Home Pfad unabhängig von der Version Allgemeine Java-Themen 7
L Java überprüfen lassen, ob sich ein gegebener Pfad / das Programm an sich auf einer CD oder Festplatte befindet Allgemeine Java-Themen 14
G Datei aus Ordner wählen, ohne den Dateinamen im Pfad angeben zu müssen Allgemeine Java-Themen 4
N relativier Pfad für sqlite-Datenbank in Gradle/IntelliJ Allgemeine Java-Themen 2
O Leerzeichen und Umlaute im Pfad einer Java Applikation machen Probleme Allgemeine Java-Themen 13
S Pfad zu Ressourcen Allgemeine Java-Themen 17
T Probleme mit dem Pfad zum Propertie file Allgemeine Java-Themen 7
C FileOutputStream konkreter Pfad Allgemeine Java-Themen 3
J Datei löschen, die Leerzeichen im Pfad hat Allgemeine Java-Themen 5
L Classpath Relativer Pfad einer Resource? Allgemeine Java-Themen 9
sandaime CMD aufrufen und aktuellen pfad ändern Allgemeine Java-Themen 11
J .exe Dateien werden nicht gestartet obwohl Pfad richtig Allgemeine Java-Themen 6
C pfad vom Image ausgeben lassen Allgemeine Java-Themen 5
O log4j pfad per umgebungsvariable setzen Allgemeine Java-Themen 5
K Classpath Falscher Pfad? o.O Allgemeine Java-Themen 2
S Shell Commands mit absolutem Pfad ausführen Allgemeine Java-Themen 2
F LWJGL in keinem Java libary Pfad? Allgemeine Java-Themen 2
M FileInputStream relativer Pfad in .jar Allgemeine Java-Themen 2
D pfad zur jre linux Allgemeine Java-Themen 8
C Kompletter Pfad aus "input type=file" auslesen Allgemeine Java-Themen 3
M Input/Output Pfad mit Leerzeichen convertieren in Kurzschreibweise (~1, ~2, etc)? Allgemeine Java-Themen 10
P Pfad zu Dateien von "Tragbaren Gerät" Allgemeine Java-Themen 3
F Pfad der laufenden JAR ermitteln (mit Archivnamen) Allgemeine Java-Themen 2
U DLLs werden nicht gefunden trotz Pfad: Allgemeine Java-Themen 4
G log4j File erzeugen und Pfad bestimmen Allgemeine Java-Themen 3
A File Java Pfad Allgemeine Java-Themen 5
D JavaEE-WebApp Pfad auslesen Allgemeine Java-Themen 3
M Pfad in int[][] finden Allgemeine Java-Themen 4
J Java Pfad nicht mehr in Path Variablen??? Allgemeine Java-Themen 2
C Environment Variable in Pfad -> Datei öffnen Allgemeine Java-Themen 5
M Relativer Pfad oder Dateien in Jar Allgemeine Java-Themen 7
D Pfad aus Ressource-Datei auslesen Allgemeine Java-Themen 7
S FileInputStream aplication Pfad Allgemeine Java-Themen 4
H Datei speichern -> Pfad erstellen? Allgemeine Java-Themen 1
T Pfad Anwendungsdaten unter Windows ermitteln Allgemeine Java-Themen 3
H2SO3- jar soll eigenen namen(pfad) finden Allgemeine Java-Themen 12
W HTML-Pfad Allgemeine Java-Themen 4
M Batch ausführen mit Leerzeichen im Pfad Allgemeine Java-Themen 7
C Applet: JFileChooser: PFad an HTML zürückgeben Allgemeine Java-Themen 4
MQue ClassLoader Pfad ausgeben Allgemeine Java-Themen 6
T Pfad aus Dateilesen -> wie diesen Pfad verwenden! Allgemeine Java-Themen 13
A Jar-File - Pfad Allgemeine Java-Themen 3
-horn- Kürzester Pfad: Code so eine gute Idee? Allgemeine Java-Themen 7
H absoluter Pfad ins working Directory Allgemeine Java-Themen 17
GambaJo Pfad zum Userprofil abhängig vom OS (/home Dok&Einst. us Allgemeine Java-Themen 3
R Wo ist der Pfad zur "Java(TM) Platform SE" Allgemeine Java-Themen 7
R Pfad zu PDF bei iText in Webapps Allgemeine Java-Themen 4
P Pfad der gerade ausgeführten Jar-Datei auslesen Allgemeine Java-Themen 2
R Entfernen der '..' Notation aus dem Pfad Allgemeine Java-Themen 2
T Java Applet PDF erstellen mit iText, Probleme mit Pfad Allgemeine Java-Themen 1
MasterEvil File.createTempFile liefert nur kurzen Pfad mit Tilde Allgemeine Java-Themen 3
T Wie bekomme ich den Pfad ohne Dateiname? Allgemeine Java-Themen 2
MQue Pfad splitten Allgemeine Java-Themen 2
P Pfad schließen xml Allgemeine Java-Themen 3
M Absoluter Pfad. Allgemeine Java-Themen 6
H Pfad einer Sounddatei von Soundkarte auslesen Allgemeine Java-Themen 15
G Problem Pfad zu wechseln Allgemeine Java-Themen 28
J Erkennen aus welchem Pfad das Jar gestartet wurde Allgemeine Java-Themen 6
S relativer Pfad? Allgemeine Java-Themen 18
S Relativen Pfad zu Pfad für File finden Allgemeine Java-Themen 4
G Problem mit Leerzeichen im Pfad bei File und getResouce Allgemeine Java-Themen 2
S Relativer Pfad in jsp Allgemeine Java-Themen 6
D Pfad ausfindig machen? Allgemeine Java-Themen 2
E Pfad angeben Allgemeine Java-Themen 5
M Den Pfad ermitteln aus dem die .jar Datei gestartet wurde Allgemeine Java-Themen 2
G ganze Pfad in einer Ordnerstruktur abbilden Allgemeine Java-Themen 19
G FileOpenDialog Pfad anlegen? Allgemeine Java-Themen 2
E in Pfad suchen Allgemeine Java-Themen 5
Q || Wie speichert man Dateien wo der Pfad als Link(UNIX)... Allgemeine Java-Themen 11
S Pfad Verwaltung Allgemeine Java-Themen 3
M Pfad zur Klasse ermitteln Allgemeine Java-Themen 2
L Pfad von Daten auf Server über FileChooseDialog Allgemeine Java-Themen 5
G absoluter pfad aus relativem Allgemeine Java-Themen 5
G Root-Pfad in einer Webapplikation finden Allgemeine Java-Themen 7
D Windows Pfad in UNC Pfad wandeln Allgemeine Java-Themen 4
G jar archiv und native klassen (pfad angabe) Allgemeine Java-Themen 2
P Leerzeichen im Pfad Allgemeine Java-Themen 8
I Pfad in einem String ändern Allgemeine Java-Themen 5
D Pfad zu meiner anwendung? Allgemeine Java-Themen 13
B relativer Pfad Allgemeine Java-Themen 18
J Pfad problem Allgemeine Java-Themen 14
D Jar-Datei-Pfad Allgemeine Java-Themen 2
welterde Pfad zur Jar-Datei Allgemeine Java-Themen 7
S Runtime exec unter MacOS X will nicht "open pfad" Allgemeine Java-Themen 7
M TreePath aus einem Pfad? Allgemeine Java-Themen 4
K Falscher Pfad beim Laden eines Bildes Allgemeine Java-Themen 9
G Servlets: Ganzer Pfad und Dateiname des verschickten Forms Allgemeine Java-Themen 15
G Wie komme ich an den Pfad zu meinem Programm? Allgemeine Java-Themen 2
thE_29 DOS pfad bekommen - die Tilde Allgemeine Java-Themen 1
A Pfad mit Leerzeichen über exec starten Allgemeine Java-Themen 6
G Relativer Pfad zu Pfad Allgemeine Java-Themen 2
H Pfad für [Ini/DB]-Datei Allgemeine Java-Themen 4
W Ein paar Fragen zu .properties und .css Allgemeine Java-Themen 6
S Test mit Werten aus der .properties Allgemeine Java-Themen 4
S class path resource [config.properties}] cannot be opened because it does not exist Allgemeine Java-Themen 4
ralfb1105 Classpath Directory fuer Properties File Allgemeine Java-Themen 2
K Properties serializable machen Allgemeine Java-Themen 6
KeVoZ_ Properties mit String auslesen Allgemeine Java-Themen 11
thet1983 Input/Output read properties file from classpath Allgemeine Java-Themen 3

Ähnliche Java Themen

Neue Themen


Oben