2009-08-05 4 views
1

Ich schreibe eine sich selbst aktualisierende Anwendung. Beim ersten Mal wird eine native Bibliothek auf dem Computer des Clients installiert, damit sie nicht jedes Mal neu geladen werden müssen. Wenn festgestellt wird, dass die Version der installierten Bibliothek älter als das neue erforderliche Minimum ist, wird das neue heruntergeladen und installiert.Wie kann eine dynamische Bibliothek, die in einem Java Applet geladen ist, ersetzt werden, ohne dass ein vollständiger Neustart des Browsers erforderlich ist?

Das Problem ist, die neue Bibliothek wird nicht wirklich von Java verwendet, bis der Benutzer den Browser schließt und neu startet (nicht die Registerkarte, der gesamte Browser). Das ist etwas, was ich vermeiden möchte - es ist in Ordnung, wenn der Benutzer die Seite aktualisieren muss, oder sie schließen und öffnen Sie es erneut.

Ich habe versucht, die installierte Bibliothek in einen temporären Ordner zu kopieren, jedes Mal, wenn das Applet startet und dann immer diese Kopie lädt, ohne Erfolg. Hat jemand hier jemals das getan? Irgendwelche guten Ideen? Das Betriebssystem ist Linux, JDK 1.5, Firefox.

Danke!

Antwort

1

ist genau die Situation in diesem Fehlerbericht beschrieben: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=5075039 (der Bericht sagt, dass es auf Windows gilt, aber es ist eigentlich eine Java-Ausgabe)

es gibt keine Möglichkeit für Java-Code eine native dLL zu entladen bis die VM beendet wird. Sobald eine DLL geladen ist, ist sie für die Lebensdauer der JVM vorhanden und die VM stellt sicher, dass sie einmal und nur einmal geladen wird.

Die einzige Möglichkeit, die ich für Ihr Szenario sehen kann, ist, wenn Sie Ihre Version überprüfen und aktualisieren können vor die DLL geladen ist. Sobald es in Gebrauch ist, bist du dran.

0

Java-Klassen können nur entladen werden, indem der Klassenlader, der sie besitzt, entladen wird. Da JNI-Bibliotheken von der besitzenden Klasse abhängig sind, müssen Sie möglicherweise den Klassenlader für die Klasse entfernen, der die Bibliothek gehört.

Versuchen Sie, eine URLClassLoader für die Klasse zu implementieren, die mit der JNI-Bibliothek verbunden ist, und Instanzen der betreffenden Klasse mit Reflektion zu erstellen. Wenn Sie es entladen möchten, erstellen Sie einen neuen Klassenlader aus einer aktualisierten JAR, der auf die neue Version der Bibliothek verweist (verwenden Sie einen anderen Bibliotheksdateinamen, damit beide Versionen gleichzeitig geladen werden können, bis der GC sich um den alten kümmert) Diese

Verwandte Themen