JARs austauschen zur Laufzeit

Status
Nicht offen für weitere Antworten.
Y

yaster

Gast
Hi Leute,

ich habe folgendes Problem:
Zur Laufzeit soll anhand einer Versionsnummer entschieden werdeb welches JAR geladen wird. Davon abhängig kann es passieren, dass danach ein anderes JAR geladen wird. In den JARs sind die Klassenpfade gleich. Die Ausführenden Klassen, sowie Resourcen (Text-Dateien) unterscheinden sich auch vom Namen.

Ich weis, dass ich über einen neuen ClassLoader einzelne Klassen (aus einer JAR) laden kan. Kann ich aber auch eine ganze JAR laden gleichzeitig laden?

Für Hilfe wäre ich sehr dankbar.

Grüße


Bsp:
Code:
ver_02.jar
    + de.beispiel.Main.class
    + version.txt
    + v01_01.txt
    + v01_02.txt
    \ v01_03.txt


ver_05.jar
    + de.beispiel.Main.class
    + de.beispiel.Spezial.class
    + version.txt
    + v05_01.txt
    + v05_02.txt
    \ spezialSkript.txt

Wird auf dem System die Version 01 gefunden, so soll zuerst de.beispiel.Main aus ver_02.jar und danach aus ver_05.jar ausgeführt werden. Ansonsten gleich de.beispiel.Main aus ver_05.jar.
In version.txt stehen zusätzliche Informationen zur "Versionierung". D.h. der Text unterscheided sich je nach Verison.
 

FArt

Top Contributor
Es werden nie ganze JARs geladen. Ressourcen werden geladen, wenn sie benötigt werden.

Was du brauchst sind einzelne Classloader (wie schon erwähnt) und eine Organisation dieser untereinander (z.B. hierarchisch).
 
Y

yaster

Gast
(Bezugnehmend auf das Beispiel von obne)
Standardmäßig ist im Programm ver_05.jar eingebunden. Wenn jetzt zum Beispiel die Version 01 vorliegt lade ich über den ClassLoader de.beispiel.Main aus ver_02.jar. Diese Klasse greift aber auf die Resource version.txt aus ver_05.jar zu. Wie kann ich das umgehen?

Einbindung der ver_02.jar:
Code:
File file = new File("path/ver_02.jar");
URL url = file.toURI().toURL();
ClassLoader cl = new URLClassLoader(new URL[]{url});
Class<?> clazz = cl.loadClass("de.beispiel.Main");

Properties properties = (Properties)getProperties();
Object instance = clazz.getConstructor(Hashtable.class).newInstance(properties);
clazz.getDeclaredMethod("execute").invoke(instance);

Beim "execute" werden eben nicht die Resourcen aus dem eigen Jar (bzw. ClassLoader) herangezogen, sondern (wenn vorhanden) aus dem anderen Jar.
 

FArt

Top Contributor
Das ist das Standardverhalten der Classloader. Du möchtest ein alternatives Verhalten, somit musst du das nach deinen Vorstellungen implementieren.

Zusatz: viele solche Anforderungen (oder Anforderungen die sich so anhören) lassen sich oft einfacher lösen. Die Frage ist, was du eigentlich damit erreichen möchtest?
Es geht um eine versionierte Applikation? Versionierte Ressourcen? Ressourcen, die kontextabhängig geladen werden sollen?
 

yaster

Mitglied
Es wird in einem Installations-Tool verwendet.
Wärend der Installation greift man auf die DB zu ließt dort die DB-Version aus. Wenn die zu alt ist, müssen vorher ältere Skripte ausgeführt werden, bevor die aktuelle DB-Version installiert werden kann.
Das Update der DB geschiet über ein Tool, dass in den Installer eingebunden ist. Das Tool hat nun schon einige Jahre hintersich gebracht und wurde ständig erneuert. Die Kernfunkion (und Path) ist allerdings geblieben. Je nach dem wie alt das Tool ist werden unterschiedliche Skripte geladen (da diese mit der Zeit verändert wurden).
Neben dieser erwähnten version.txt exitieren auch noch Propertie-Klassen die ebenfalls mitlerweile andere Keys und Values haben.
Es ist zwar ein Tool für sich, aber sollte trotzdem nicht über irgendwelche Zeilen-Kommandos ausgeführt werden, sondern über Instanzieirung. Dafür müsste man aber eine JAR "aushängen" und an stelle diese eine andere JAR "einbinden" können.
Ist sowas möglich? Auch wenn ich dafür mehrere Klassen schreiben muss...

Meine Idee war es eben die Main-Klasse über einen eigenen ClassLoader zu laden. Ich dachte eigentlich, dass diese Main-Klasse ebenfalls die ganzen Klassen bzw. Resourcen dann aus dem gleichen JAR nachläd. Das mit den Klassen wäre nicht weiter schlimm, da sich nur wenige verändert haben. Aber wie kann ich dann ALLE Resourcen nachladen, ohne sie einzeln aufzulisten?

Wenn jemand hierfür eine Lösung, BITTE antworten

DANKE!!!
 

FArt

Top Contributor
Das ist möglich, aber nicht so wirklich trivial.

Im Prinzip ist das ein Plugin-Mechanismus, wobeil die Core-Applikation dein Hauptteil ist, die verschiedenen Versionen sind die "Plugins".

Grob musst du folgendes Realisieren:
- erzeuge für jede Version einen Classloader
- ermittel die Updateskripten in diesen Versionen
- lege (anhand der ermittelten Versionen) die Ausführungsreihenfolge fest
- führe die Aktionen nacheinander aus (wichtig: jede Einzelaktion nur mit Ressourcen aus der Version, die auch das Skript enthält)
 

yaster

Mitglied
Ursprünglich war ja das aktuelle Tool im Installer integriert, d.h. es wurde in den Klassenpath geladen.

Wenn ich nun für jedes jar einen eigenen ClassLoader erstelle, so werden ja die zu benutzenden Klassen und Resourcen in den Klassenpath geladen. Außerdem muss ich jede Klasse die angesprochen wird explizit laden; oder gibt es hierfür einen Automatismus?
Wie mache ich das dann, dass er nicht die schon geladenen Klassen und Resourcen benutzt, wenn ich die Main-Klasse des nächsten ClassLoader ausführe.

Wie stelle ich sicher, dass die Klassen und Resourcen herangezogen werden die innerhalb des Jars?
 

FArt

Top Contributor
Noch mal zurück: das alles hier zu diskutieren würde zu weit führen, so lange du mit Classloadern nicht sattelfest bist.

Wie gesagt: alles andere als trivial.

Such dir mal an Doku bzgl. Classloader. Versuche zu verstehen, wie der Standard fuktioniert, danach wie man einen Plugin-Mechanismus realisiert.
Schaue mal nach Tutorials und Beispielen bzgl. "custom classloading" u.Ä.
Es gibt bekannte Tools, die das Standardverhalten der Classloader nach ihren Bedürfnissen verändern (z.B. JUnit, ANT, ...). So etwas kann dir als Basis dienen. Andere (z.B. JBoss oder Tomcat) haben noch komplexere Verhalten, können aber als Anregung bzw. zum Spicken dienen.
Wenn du das alles drauf hast, dann kannst du noch mal die von mir angerissenen groben Punkte ansehen.
Jetzt sollte klar sein, wie der Hase läuft bzw. es sollte nur noch konkrete Probleme geben, die man hier gut diskutieren kann.
 

FArt

Top Contributor
maki hat gesagt.:
Íst dafür nicht auch OSGi da?
Ich glaube so einfach ist das nicht, lasse mich aber gerne diesbezüglich belehren... deckt OSGi die Anforderungen wirklich ab, denn es geht ja nicht nur darum die richtige Version anzuliefern?
 
M

maki

Gast
Mein "Wissen" oder besser "nicht-Wissen" was OSGi betrifft ist rein theoretisch, vielleicht kommt ja noch jemand der wikrlich etwas darüber weiss. (Wildcard?)
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Java mit command line und jars benutzen? Allgemeine Java-Themen 18
RalleYTN Java 9 Module mit Dependency auf Pre-Java 9 JARS Allgemeine Java-Themen 2
S Maven Jars dynamisch laden / Plugin-Struktur erstellen Allgemeine Java-Themen 14
H NetBeans geotools 15 oder 16 - welche Abhängingkeiten gibt es? Welche Jars brauche ich? Allgemeine Java-Themen 4
windl Problem mit externen Nachladen von Jars Allgemeine Java-Themen 10
B Datei innerhalb des JARs von einer statischen Methode aufrufen Allgemeine Java-Themen 4
J Suche: Tool zum Auffinden gleichnamiger Klassen (Name und Package gleich) in unteschiedlichen JARs Allgemeine Java-Themen 5
J Jars in unterschiedlichen Versionen Allgemeine Java-Themen 14
X Neuerdings ein Problem mit dem Starten von Jars Allgemeine Java-Themen 5
A Jars oder JNLPs aus java code in gleicher JVM starten Allgemeine Java-Themen 2
M Webstart Exception trotz signierten JARs Allgemeine Java-Themen 3
M Klassen in vielen Jars ermitteln Allgemeine Java-Themen 2
C Runnable Jars Allgemeine Java-Themen 2
M JARS in JAR? Allgemeine Java-Themen 4
D Packages in ausführbaren Jars Allgemeine Java-Themen 4
KrokoDiehl Viele JARs und deren Resourcen Allgemeine Java-Themen 9
G Output eines über Runtime.getRuntime.exec gestarteten Jars Allgemeine Java-Themen 6
R Kann ich die jars eines Applets auf verschiedenen Domains hosten? Allgemeine Java-Themen 2
D Ahängige Bibliotheken (JARs) ermitteln Allgemeine Java-Themen 6
C Tool zum verkleinern der Jars? Allgemeine Java-Themen 23
V Anderes tmp-dir bei jars? Allgemeine Java-Themen 2
G Applet mit meheren JARs Allgemeine Java-Themen 2
E JFreeChart jars mit in meine Jar packen Allgemeine Java-Themen 6
DeeDee0815 Resourcen in JARs auslagern Allgemeine Java-Themen 4
M Klassen eines Jars auslesen Allgemeine Java-Themen 3
T Wo kann ich einzelne JARs herunterladen Allgemeine Java-Themen 3
H externe JARs in eigenem Programm-Jar einbinden. Allgemeine Java-Themen 5
N Main-Klasse wird beim Aufruf des JARs nicht gefunden Allgemeine Java-Themen 8
M Probleme mit JARs Allgemeine Java-Themen 7
spacegaier HeapSpace der VM ändern -> Verhalten von JARs und EXEs Allgemeine Java-Themen 10
J jars Allgemeine Java-Themen 4
A signed jars gegen keystore "authentifizieren" Allgemeine Java-Themen 7
C Dynamisches Nachladen von JARs (Plugin) Allgemeine Java-Themen 3
M Klassen von ausserhalb des Jars per Reflection nachladen Allgemeine Java-Themen 2
O Externe Jars in eigene JAr packen in Eclipse Allgemeine Java-Themen 5
A Verzeichnis auflisten - auch innerhalb eines Jars Allgemeine Java-Themen 6
H Jars gehen nicht Allgemeine Java-Themen 6
J Mal wieder jars Allgemeine Java-Themen 2
G Suche Programm um mehrere Jars in eines zu integrieren Allgemeine Java-Themen 7
A Java Klasse auf Tomcat während der Laufzeit austauschen Allgemeine Java-Themen 1
T Methoden Zahlen austauschen Allgemeine Java-Themen 8
R .class Datei in .jar austauschen Allgemeine Java-Themen 2
T Objekt dynamisch neu erstellen/ austauschen Allgemeine Java-Themen 9
T Standard LAF austauschen Allgemeine Java-Themen 3
W Columns austauschen/verschieben von jtable Allgemeine Java-Themen 3
M Mit HTML in Servlet Daten austauschen Allgemeine Java-Themen 3
S Build-Zeitpunt (Datum und Uhrzeit) irgendwie während der Laufzeit zugänglich machen..? Allgemeine Java-Themen 4
M Laufzeit des Prim Algorithmus Allgemeine Java-Themen 3
M Laufzeit LinkedList Allgemeine Java-Themen 9
M verbesserte Laufzeit bei LinkedList Allgemeine Java-Themen 7
K Verbesserung der Laufzeit beim Sortieren von Einwohnern nach ihrem Geburtsjahr Allgemeine Java-Themen 0
H was ist den dieses zur Kompilierzeit und zur Laufzeit in Java? Allgemeine Java-Themen 3
L Classpath Zur Laufzeit bestimmte Klassen in Classloader hinzufügen? Allgemeine Java-Themen 4
L Compiler-Fehler Google Guice Module zur Laufzeit zusammenstellen und binden Allgemeine Java-Themen 4
J Jasper Reports - Subreport zur Laufzeit ändern Allgemeine Java-Themen 6
O jar und EXE Dateien, Pfade zur Laufzeit Allgemeine Java-Themen 1
T Externe Java Klasen zur Laufzeit einbinden Allgemeine Java-Themen 10
X Collections Gibt es eine Klasse welche die Vorteile von List und HashMap vereint, aber konstante Laufzeit (O(1)) hat in Java? Allgemeine Java-Themen 4
D Boolean von ein anderem Java Programm während der Laufzeit ändern Allgemeine Java-Themen 23
N Generic Type einer Generischen Klasse während der Laufzeit bekommen Allgemeine Java-Themen 2
J .java-Dateitext Compile zur Laufzeit ohne File Allgemeine Java-Themen 15
kodela Daten während Laufzeit zugriffsbereit Allgemeine Java-Themen 15
Neumi5694 Interpreter-Fehler final Eigenschaft während Laufzeit geändert Allgemeine Java-Themen 2
M Sinn von Kompilierung zur Laufzeit Allgemeine Java-Themen 3
T Java Class Intrumentation mit Annotations in Laufzeit Allgemeine Java-Themen 1
S Byte Array welches in Laufzeit aufgelöst wird // Objekt Array Allgemeine Java-Themen 3
T Dateien zur Laufzeit in Java-Programm packen? Allgemeine Java-Themen 3
S Laufzeit Primzahlgenerator Allgemeine Java-Themen 18
S Zur Laufzeit Klasse mit einer anzahl von X Objekten erstellen Allgemeine Java-Themen 5
F Classpath Programmteile zur Laufzeit nachladen Allgemeine Java-Themen 6
D Variablen zur Laufzeit global speichern (Registry Pattern?) Allgemeine Java-Themen 6
H ResourceBundle während Laufzeit bearbeiten Allgemeine Java-Themen 3
J Input/Output Jar-Datei zur Laufzeit erweitern Allgemeine Java-Themen 13
P Generic zur Laufzeit Allgemeine Java-Themen 4
A ar während der Laufzeit überschreiben Allgemeine Java-Themen 20
X MergeSort Laufzeit Problem Allgemeine Java-Themen 4
J Resourcen waehrend der Laufzeit aendern? Allgemeine Java-Themen 9
P Wie bei log4j den Dateipfad der Logdatei zur Laufzeit ändern? Allgemeine Java-Themen 3
X Update einer Jar während der Laufzeit Allgemeine Java-Themen 8
T Klassen Fabrik (Factory) zur Laufzeit erweitern Allgemeine Java-Themen 5
S UML zur Laufzeit ändern Allgemeine Java-Themen 10
E Wert von enum zur Laufzeit festlegen. Allgemeine Java-Themen 5
L Methode in Thread mit langer Laufzeit unterbrechen (ANT executeTarget) Allgemeine Java-Themen 4
O Problem bei Darstellung der Laufzeit eines Programms Allgemeine Java-Themen 3
hdi Ressourcen dynamisch zur Laufzeit laden Allgemeine Java-Themen 15
A Wie zur Laufzeit auf Objekte zugreifen Allgemeine Java-Themen 7
N variable Anzahl von Objektinstanzen zur Laufzeit erstellen Allgemeine Java-Themen 4
P Java Konsole zur Laufzeit einblenden Allgemeine Java-Themen 4
P Klassenwahl zur Laufzeit Allgemeine Java-Themen 5
R Objekt zur Laufzeit zerstören? Allgemeine Java-Themen 12
E formartierte Ausgabe zur Laufzeit Allgemeine Java-Themen 2
Sonecc Zugriff auf Class File einer anderen Jar während der Laufzeit Allgemeine Java-Themen 2
F Wie zur Laufzeit ganz neue Objekte erzeugen? Allgemeine Java-Themen 5
T Class-files zur Laufzeit zu Reflection-Zwecken laden Allgemeine Java-Themen 18
DamienX Debug Modus zur Laufzeit erkennen Allgemeine Java-Themen 3
Stillmatic Debuggen/ Laufzeit von Methoden Allgemeine Java-Themen 2
Dragonfire Generic Typ zur Laufzeit Allgemeine Java-Themen 9
M Klasse zur Laufzeit ersetzen Allgemeine Java-Themen 10
S Wie gross ist die Laufzeit für diese Schleife?? Allgemeine Java-Themen 8
G File zur Laufzeit erzeugen Allgemeine Java-Themen 4

Ähnliche Java Themen

Neue Themen


Oben