2010-09-01 12 views
5

Ich baue ein Update-System, in dem ich in der Lage sein muss, ein referenziertes jar eines laufenden Application jar zur Laufzeit zu ersetzen. Ich habe jedoch Probleme mit der Dateisperrung unter Windows, wenn ich versuche, Dateifunktionen auf dem Jar auszuführen, wie zum Beispiel 'setLastModified'.Ein laufendes jar zur Laufzeit austauschen

Nach einigen googeln ich diesen Schnipsel gefunden ...

Was ich in meiner Forschung gefunden, dass die Standard-Classloader Implementierung nie ein Glas Datei schließt, sobald es geöffnet wurde. Es auch lädt nur Ressourcen aus der JAR-Datei nach Bedarf. Zu jedem Zeitpunkt kann es Klassen in der JAR-Datei geben, die nicht in den Speicher geladen wurden. Offensichtlich, wenn Sie die JAR-Datei aus dem ClassLoader heraus, und es versucht, eine Ressource in der fehlende Datei zu finden, werden Sie eine IOException mindestens erhalten.

Hat jemand irgendwelche Verweise auf Informationen dazu, oder um dieses Problem zu umgehen?

Danke.

+0

Müssen Sie das Rad neu erfinden? OSGi hat bereits eine Hot-Deployment-Funktion. Schauen Sie nach und sehen Sie, ob Sie das stattdessen verwenden könnten. – SteveD

+0

OSGi klingt wie überwältigend für die meisten Anforderungen, werfen Sie einen Blick auf diese Antwort http://StackOverflow.com/A/2463978/320594 –

+0

Nach dem erneuten Lesen scheint es, Sie wollen Ihre Anwendung laufen lassen, aber mit den neuen Gläsern ... so sieht OSGi wirklich wie eine gute Lösung aus :), zum Beispiel ermöglicht Eclipse das (Plugins werden beim Laufen neu geladen) und benutzt dafür OSGi (so lange ich weiß). –

Antwort

5

Es gibt eine Menge von Lösungen für die Klassen/lib Hot-Swapping:

Es hängt davon ab, was Sie tun wollen.

+2

OSGi ist riesig und JRebel ist nur für die Entwicklung, da es eine teure Lizenz benötigt (kostenlos für OSS-Projekte). Nicht sicher über Hotswap für Ameisen – TheLQ

2

Die nächste Sache ist OSGi

haben Sie einen Blick auf die ‚Siehe auch‘ des genannten artice für Betonprodukte.

0

Ich kenne keinen guten Weg, damit umzugehen. Das Erstellen eines benutzerdefinierten Classloaders könnte eine Option sein, obwohl ich diese Idee nicht mag.

Wir haben daran gearbeitet, indem wir einen Updater aus einem separaten Jar ausgeführt haben, bevor wir die Hauptanwendung starteten. Das funktioniert gut genug, aber offensichtlich können Sie das jar nur aktualisieren, wenn die Anwendung gestartet wird.