Wie mache ich eine Java app selbst aktualisieren?
Problem: ich habe eine standalone-Java-app (im folgenden bezeichnet als "der agent"), der als Dienst läuft auf interne Unternehmens-Servern. Es wirkt wie ein remote-agent für einige zentrale Server. Als der agent erhält bereitgestellt, die in mehr Orte, die Verwaltung wird immer komplizierter. Speziell: durch updates ist schmerzhaft, weil es ein Recht manueller Prozess, und der Zugriff auf die Protokolle und weitere Infos über die Umgebungen, in denen die Agenten ausgeführt werden, ist problematisch, so dass das Debuggen schwierig. Die Server in der Diskussion sind headless und unbeaufsichtigt, was bedeutet, dass es sich um einen voll automatisierten Prozess ohne manuellen Eingriff, daher Java Web Start ist nicht eine praktikable Lösung.
Vorgeschlagene Lösung: Stellen Sie den agent-Telefon zu Hause (auf dem zentralen Server) regelmäßig zu bieten-agent-status und-updates prüfen.
Ich bin offen für andere vorgeschlagene Lösungen für das problem, aber ich habe bereits einen funktionierenden Prototypen für die "status-und self-updates" - Idee, die ist, was diese Frage fokussiert wird.
Was ich kam mit ist eigentlich ein separates Projekt, das als wrapper für den Agenten. Die wrapper in regelmäßigen Abständen ruft die zentralen server über HTTP zu überprüfen, ob eine aktualisierte version des Agenten. Auf der Suche nach einem update, lädt es die neue version, schaltet sich das agent ausgeführt wird, und beginnt das neue. Wenn das scheint wie eine seltsame oder Kreisverkehr-Lösung, hier sind ein paar weitere überlegungen/Einschränkungen erwähnenswert:
- Wenn der wrapper erhält eine neue version des agent, möglicherweise gibt es neue JAR-Abhängigkeiten, was bedeutet class-path ändert, was bedeutet, dass ich wahrscheinlich wollen, um zu laichen einen eigenen Java-Prozess statt hantieren mit Classloadern und Gefahr zu laufen, eine dauerhafte generation memory leak, das wäre ein manueller Eingriff erforderlich-genau das, was ich versuche, um Weg von. Dies ist der Grund, warum ich landete mit einem separaten, "wrapper" - Prozess zur Verwaltung des agent-updates in mein Prototyp.
- Einige Server, auf denen die Agenten bereitgestellt werden, sind die Ressourcen begrenzt, so dass jede Lösung muss niedrig sein, die auf CPU-und Speichernutzung. Das macht mich wollen eine Lösung, die nicht die Spinnen eine neue JVM und ist ein Schlag gegen eine separate wrapper-Prozess.
- Der agent ist bereits im Einsatz auf Windows-und RHEL-Servern, so muss die Lösung sein, cross-Plattform, obwohl ich würde nicht habe ein problem beim duplizieren einer angemessenen Betrag des Prozesses in batch-und bash-Skripte, um die Dinge ins Rollen.
Frage: Wie gesagt, ich möchte wissen, wie Sie eine self-Update-Java-app. Genauer gesagt, gibt es irgendwelche frameworks/Bibliotheken gibt, die würden mir helfen mit diesem? Kann jemand mit Erfahrungen in diesem Bereich geben Sie mir einige Hinweise?
- stackoverflow.com/questions/305461/...
- Siehe Jenkins Beispiele: wiki.jenkins-ci.org/display/JENKINS/...
- Ihre Lösung würde nicht lassen Sie ein update der wrapper selbst, richtig?
- Richtig. Eine ideale Lösung wäre eine, wo es nichts eingesetzt, dass kann nicht aktualisiert werden. Meine wrapper-Prototyp ist sicherlich nicht so, aber im Idealfall (wieder), die wrapper müssen nicht aktualisiert, weil es eine einfache Aufgabe und nur wenigen beweglichen teilen.
- Guter link. Ich haben zu denken, dass man. Den Jenkins-Modell lässt sich mir den Wechsel von einer pull-zu einer push, wo die zentralen Server weitergeleitet werden könnten, um einen agent zu installieren oder ein update auf einem remote-server über SSH oder einige andere Protokoll.
- Nach 2 Jahren, welche Lösung du genommen hast? Verfasst Eure eigenen wrapper oder bestehende frameworks/Bibliotheken wie ace.apache.org? Ich habe das gleiche problem zu verwalten > 3000-Agenten.
- können Sie überprüfen, ob ich noch Antwort ?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn die Anwendung von OSGi-basierten, könnten Sie lassen OSGi-Griff bundle updates für Sie. Es ist ähnlich wie der wrapper-Ansatz, den Sie vorschlagen, in das OSGi-container selbst ist "wrapper" und es wird nicht aktualisiert. Hier ist eine Diskussion über diese
Andere Lösung: nutzen (und bezahlen) install4j. Check-out die auto-update-Funktionen hier
Keine Notwendigkeit für wrapper (spart Speicher) oder java web start (fügt mehr Beschränkungen auf Ihre Anwendung), lassen Sie einfach ein thread in dem Sie die Anwendung überprüfen Sie in regelmäßigen Abständen für Aktualisierungen (z.B. cloud) und herunterladen von updates, wenn verfügbar, dann code diese beiden Aufrufe in Sie Anwendung:
.sh
oder.cmd
) zu aktualisieren, Ihre Artefakte und starten Sie Ihre Anwendung nach ein paar Sekunden pause in das Skript(um zu vermeiden, dass zwei Instanzen der Anwendung gleichzeitig).Kann das Skript überschreiben benötigten Artefakte und re-starten Sie Ihre Anwendung.
genießen !
Haben Sie einen Blick auf Java Web Start.
Es ist eine Technologie, die Bestandteil von Java seit... 1.5? vielleicht 1.4? und ermöglicht das deployment und die Installation von standalone-Java-basierte Anwendungen über einen web-browswer. Es ermöglicht Ihnen auch, immer die aktuellste app.
http://www.oracle.com/technetwork/java/javase/overview-137531.html
http://en.wikipedia.org/wiki/JNLP#Java_Network_Launching_Protocol_.28JNLP.29
siehe auch diese Frage: Was ist der beste Weg, um ein selbst-update-Funktion, um eine Java-Swing-Anwendung?
Scheint es, als ob Webstart ist das nur die eingebaute Möglichkeit, dies zu tun im moment.