Hallo,
bin da gestern auf ein Verhalten gestoßen, dass ich nicht verstehe und hoffe hier kann mir jemand weiterhelfen.
Folgendes Szenario: Eine Java SE (Maven Projekt) Anwendung die aus mehreren Modulen und 3rd Party Dependencies besteht. Alle Module besitzen jeweils eine Datei config.xml diese befindet sich im META-INF Verzeichnis. Diese Dateien will ich zur Laufzeit auslesen um sie weiterzubearbeiten.
Nun ging es darum eine ausführbare Anwendung zu erstellen. Alles in ein Jar zusammenpacken geht nicht, da sich die config.xml Datein gegenseitig überschreiben würden.
Also Module und 3rd Parties außerhalb des Jars in einen Ordner "lib" gelegt und Maven das class-path Element in der Manifest.mf genieren lassen. Starten der Anwendung über "java -jar appname.jar"
Die Anwendung startet aber egal wie ich den Classpath durchsuche (Benutze dafür sogar eine Library corn-cps) ich finde nur eine config.xml Datei nämlich die, die sich in "appname.jar" befindet. Die Klassen in dem "lib" Verzeichniss werden aber geladen.
Nach ein bisschen rumprobieren habe ich nun folgende Lösung gefunden. Alle Jar Dateien, 3rd Party, Module und Hauptanwendung in einen Ordner geworfen. Die Anwendung starte ich nun mit
java -cp "ordner/*" com.meinefirma.MainClass.
Nun werden beim scannen alle config.xml Dateien gefunden und alles funktioniert.
Ich finde es zwar schön dass nun alles geht aber ich würde gerne wissen warum. Sind da jetzt andere Classloader im Spiel? Was genau macht denn dieses -cp anders wie -jar, dass dann die Manifest.mf auswertet. In der Java Doku steht zum beispiel auch das bei -cp Wildcards erlaubt sind also "ordner/*" womit alle Jar Dateien geladen werden, die sich in dem Ordner befinden. Das class-path element in der Manifest.mf unterstützt diese Wildcards aber nicht.
Wäre toll wenn mir hier irgendjemand weiterhelfen könnte.
bin da gestern auf ein Verhalten gestoßen, dass ich nicht verstehe und hoffe hier kann mir jemand weiterhelfen.
Folgendes Szenario: Eine Java SE (Maven Projekt) Anwendung die aus mehreren Modulen und 3rd Party Dependencies besteht. Alle Module besitzen jeweils eine Datei config.xml diese befindet sich im META-INF Verzeichnis. Diese Dateien will ich zur Laufzeit auslesen um sie weiterzubearbeiten.
Nun ging es darum eine ausführbare Anwendung zu erstellen. Alles in ein Jar zusammenpacken geht nicht, da sich die config.xml Datein gegenseitig überschreiben würden.
Also Module und 3rd Parties außerhalb des Jars in einen Ordner "lib" gelegt und Maven das class-path Element in der Manifest.mf genieren lassen. Starten der Anwendung über "java -jar appname.jar"
Die Anwendung startet aber egal wie ich den Classpath durchsuche (Benutze dafür sogar eine Library corn-cps) ich finde nur eine config.xml Datei nämlich die, die sich in "appname.jar" befindet. Die Klassen in dem "lib" Verzeichniss werden aber geladen.
Nach ein bisschen rumprobieren habe ich nun folgende Lösung gefunden. Alle Jar Dateien, 3rd Party, Module und Hauptanwendung in einen Ordner geworfen. Die Anwendung starte ich nun mit
java -cp "ordner/*" com.meinefirma.MainClass.
Nun werden beim scannen alle config.xml Dateien gefunden und alles funktioniert.
Ich finde es zwar schön dass nun alles geht aber ich würde gerne wissen warum. Sind da jetzt andere Classloader im Spiel? Was genau macht denn dieses -cp anders wie -jar, dass dann die Manifest.mf auswertet. In der Java Doku steht zum beispiel auch das bei -cp Wildcards erlaubt sind also "ordner/*" womit alle Jar Dateien geladen werden, die sich in dem Ordner befinden. Das class-path element in der Manifest.mf unterstützt diese Wildcards aber nicht.
Wäre toll wenn mir hier irgendjemand weiterhelfen könnte.
Zuletzt bearbeitet: