2012-04-20 8 views
24

Problem: Ich habe eine eigenständige Java-Anwendung (im Folgenden als "der Agent" bezeichnet), die als Dienst auf internen Unternehmensservern ausgeführt wird. Es fungiert als Remote-Agent für einige zentrale Server. Wenn der Agent an mehreren Orten bereitgestellt wird, wird die Verwaltung der Agenten komplizierter. Insbesondere: Das Push-up von Updates ist schmerzhaft, da es sich um einen ziemlich manuellen Prozess handelt und der Zugriff auf die Protokolle und andere Informationen über die Umgebungen, in denen die Agenten ausgeführt werden, problematisch ist, was das Debugging erschwert. Die diskutierten Server sind kopflos und unbeaufsichtigt, was bedeutet, dass dies ein vollautomatischer Prozess ohne manuellen Eingriff sein muss. Daher ist Java Web Start keine praktikable Lösung.Wie kann ich eine Java-App selbst aktualisieren?

Vorgeschlagene Lösung: Machen Sie das Agent-Telefon regelmäßig (zu den zentralen Servern), um den Agentenstatus anzuzeigen und nach Updates zu suchen.

Ich bin offen für andere vorgeschlagene Lösungen für das Problem, aber ich habe bereits einen funktionierenden Prototyp für die "Status und Self-Updates" Idee, auf die sich diese Frage konzentriert.

Was ich entwickelte, ist eigentlich ein separates Projekt, das als Wrapper für den Agenten fungiert. Der Wrapper ruft den zentralen Server regelmäßig über HTTP auf, um nach einer aktualisierten Version des Agenten zu suchen. Wenn ein Update gefunden wird, lädt es die neue Version herunter, beendet den laufenden Agenten und startet den neuen. Wenn das wie eine ungerade oder Kreisverkehr Lösung scheint, hier sind ein paar andere Überlegungen/Zwänge bemerkenswert:

  1. Wenn der Wrapper eine neue Version des Agenten erhält, kann es neue JAR-Abhängigkeiten, Klassenpfad Änderungen bedeutet, Das bedeutet, dass ich wahrscheinlich einen separaten Java-Prozess erstellen möchte, anstatt an ClassLoadern herumzufummeln und das Risiko eines permanenten Speicherverlusts zu generieren, der manuelle Eingriffe erfordern würde - genau das, was ich versuche wegzukommen. Aus diesem Grund habe ich einen separaten "Wrapper" -Prozess zur Verwaltung der Agentenaktualisierungen in meinem Prototyp abgeschlossen.
  2. Einige Server, auf denen die Agenten bereitgestellt werden, sind ressourcenbegrenzt. Daher muss bei jeder Lösung die CPU- und Speicherauslastung gering sein. Das bringt mich dazu, eine Lösung zu suchen, bei der keine neue JVM erstellt werden muss und die einen separaten Wrapper-Prozess verhindert.
  3. Der Agent ist bereits auf Windows- und RHEL-Servern implementiert, daher muss die Lösung plattformübergreifend sein, obwohl ich kein Problem haben würde, einen vernünftigen Teil des Prozesses in Batch- und Bash-Skripten zu duplizieren.

Frage: Wie bereits erwähnt, möchte ich wissen, wie eine sich selbst aktualisierende Java-Anwendung zu machen. Genauer gesagt, gibt es irgendwelche Frameworks/Bibliotheken, die mir dabei helfen könnten? Kann jemand mit Erfahrung in diesem Bereich mir einige Hinweise geben?

+2

http://stackoverflow.com/questions/305461/automatic-updates-of-java-desktop-application –

+0

Siehe Jenkins Beispiele: https://wiki.jenkins-ci.org/display/JENKINS/Distributed+builds # Distributedbuilds-LaunchslaveagentviaJavaWebStart –

+0

Ihre Lösung würde Ihnen nicht erlauben, den Wrapper selbst zu aktualisieren, richtig? – Miquel

Antwort

0

Es scheint, als ob Webstart der einzige eingebaute Weg ist, dies im Moment zu tun.

+0

Siehe meinen Kommentar zu der anderen "Web Start" -Antwort. –

+0

down Wählerpflege zu kommentieren? –

+0

Es war nicht ich, aber ich erwarte es, weil Webstart keine Lösung für die Frage ist. –

2

Werfen Sie einen Blick auf Java Web Start.

Es ist Technologie, die seit 1.5 Teil von Java ist? vielleicht 1,4? und ermöglicht die Bereitstellung und Installation von eigenständigen Java-basierten Anwendungen über eine Web-Browser. Außerdem können Sie immer die neueste App ausführen.

http://www.oracle.com/technetwork/java/javase/overview-137531.html

http://en.wikipedia.org/wiki/JNLP#Java_Network_Launching_Protocol_.28JNLP.29

auch diese Frage: What's the best way to add a self-update feature to a Java Swing application?

+1

Es tut mir leid. Ich wollte klarstellen, dass dies Headless-Server sind und die App als Hintergrund-Daemon läuft. Dies sind keine Arbeitsstationen. Sie haben keine Desktop-Umgebung, geschweige denn einen Web-Start-fähigen Browser.Ich besuchte Web Start, kam aber zu dem Schluss, dass es darauf ausgerichtet war, eine Anwendung an einen Benutzer zu liefern. Dies soll vollständig automatisiert und unbeaufsichtigt sein. Ich werde meine Frage aktualisieren, um das klarzustellen. –

+0

Webstart kann über die Befehlszeile (benötigt keinen Browser) mit dem Befehl javaws aufgerufen werden: http://docs.oracle.com/javase/1.5.0/docs/guide/javaws/developersguide/javaws.html –

+1

I ' Ich bin mir nicht sicher, aber ich denke, dass es keine Möglichkeit gibt, das Sicherheits-Popup bei der Verwendung von JavaWays zu verhindern, selbst von der Befehlszeile aus. Für Benutzer, die Java-Anwendungen bereitstellen möchten, ohne ein vertrauenswürdiges Sicherheitszertifikat zu bezahlen oder bestehende Java-Anwendungen still zu aktualisieren, wird Java Web Start unvorteilhaft. – Andy

4

Wenn Ihre Anwendung OSGi basiert, könnten Sie lassen OSGi für Sie Bündel Updates behandeln. Es ähnelt dem von Ihnen vorgeschlagenen Wrapper-Ansatz, da der OSGi-Container selbst "der Wrapper" ist und einige davon nicht aktualisiert werden. Hier ist eine Diskussion über this

+0

Guter Gedanke. Ich habe über OSGi nachgedacht, aber da ist die Ressourcenbeschränkung zu beachten. Die OSGi-Container, die ich ausprobiert habe, haben erhebliche Speicher-Fußabdrücke, ohne dass ihnen sogar Bundles bereitgestellt werden. Ich wäre jedoch froh, in diesem Punkt korrigiert zu werden. –

+1

Eine andere Ressource ist Ihre Zeit. OSGi ist extrem invasiv in die Architektur Ihrer App und die Klassenlade-Regeln, die es auferlegt, können eine Weile dauern, um zu lernen. Es ist in Ordnung, wenn Sie erst einmal am Laufen sind (und jemanden zu haben, der ein Update implementiert, ist großartig!), Aber denken Sie nicht, dass dies ein Arbeitstag sein würde. –

4

Andere Lösung: Verwenden Sie (und bezahlen) install4j. Überprüfen Sie die Auto-Update-Funktionen here

+0

Das ist der beste Vorsprung, den ich bisher gesehen habe, den ich von [einer anderen Frage] abgeholt habe (http://stackoverflow.com/questions/207557/whats-the-best-way-to-add-a-self-update) -feature-to-a-java-swing-Anwendung), obwohl ich nicht tief genug gegraben habe, um zu sehen, ob es wirklich meinen Bedürfnissen entspricht. –

2

Keine Notwendigkeit für Wrapper (Speicher sparen) oder Java Web Start (fügt weitere Einschränkungen für Ihre Anwendung), lassen Sie einfach einen Thread in Ihrer Anwendung regelmäßig auf Updates (z. B. aus der Cloud) und herunterladen von Updates, wenn vorhanden, dann diese beiden Anrufen in ihrem Anwendungscode:

  1. Start eines Shell-Skript (.sh oder .cmd) Ihre Artefakte und starten Sie Ihre Anwendung zu aktualisieren, nachdem einige Sekunden im Skript Pause (zur Vermeidung von zwei Instanzen mit Ihrer Bewerbung zur gleichen Zeit).
  2. Beenden Sie Ihre Anwendung (erste Instanz)

Das Skript kann benötigt Artefakte überschreiben und neu starten Sie Ihre Anwendung.

viel Spaß!

Verwandte Themen