Ich habe gerade eine Java-Anwendung geerbt, die als Dienst unter XP und Vista installiert werden muss. Es ist ungefähr 8 Jahre her, seit ich Windows in irgendeiner Form verwendet habe und ich musste nie einen Dienst erstellen, geschweige denn aus einer Java-App (ich habe eine JAR für die App und eine einzige Abhängigkeits-JAR - log4j ). Was ist die Magie, die notwendig ist, um diesen Dienst auszuführen? Ich habe die Quelle, so dass Codeänderungen möglich sind, obwohl sie vorzugsweise vermieden werden.
java
windows-services
Ideenbildhauer
quelle
quelle
Antworten:
Ich hatte etwas Glück mit dem Java Service Wrapper
quelle
Apache Commons Daemon ist eine gute Alternative. Es hat Procrun für Windows-Dienste und Jsvc für Unix-Daemons. Es verwendet eine weniger restriktive Apache-Lizenz und Apache Tomcat verwendet sie als Teil seiner selbst, um unter Windows und Linux ausgeführt zu werden! Es ist etwas schwierig, es zum Laufen zu bringen, aber es gibt einen ausführlichen Artikel mit einem funktionierenden Beispiel.
Außerdem können Sie sich die Datei bin \ service.bat in Apache Tomcat ansehen , um eine Vorstellung davon zu bekommen, wie der Dienst eingerichtet wird. In Tomcat benennen sie die Procrun-Binärdateien um (prunsrv.exe -> tomcat6.exe, prunmgr.exe -> tomcat6w.exe).
Bei Problemen mit Procrun müssen Ihre Start- und Stoppmethoden die Parameter (String [] argv) akzeptieren. Zum Beispiel würden "start (String [] argv)" und "stop (String [] argv)" funktionieren, aber "start ()" und "stop ()" würden Fehler verursachen. Wenn Sie diese Anrufe nicht ändern können, sollten Sie eine Bootstrapper-Klasse erstellen, die diese Anrufe entsprechend Ihren Anforderungen massieren kann.
quelle
--JvmOptions=-Dopt=a#-Dopt2=b
. Ich habe den Befehl von einem Ameisenskript aus ausgeführt und habe deshalb tagelang gekämpft. Ich hoffe es hilft.Mit Apache Commons Daemon können Sie jetzt einen benutzerdefinierten ausführbaren Namen und ein Symbol haben! Sie können auch einen benutzerdefinierten Windows-Tray-Monitor mit Ihrem eigenen Namen und Symbol erhalten!
Ich habe jetzt meinen Dienst mit meinem eigenen Namen und Symbol (prunsrv.exe) ausgeführt, und der Taskleistenmonitor (prunmgr.exe) hat auch meinen eigenen benutzerdefinierten Namen und mein eigenes Symbol!
MyServiceName.exe
undMyServiceNamew.exe
jeweils.Laden Sie WinRun4J herunter und
RCEDIT.exe
ändern Sie die ausführbare Apache-Datei mit dem mitgelieferten Programm, um Ihr eigenes benutzerdefiniertes Symbol wie folgt einzubetten:Installieren Sie nun Ihren Windows-Dienst wie folgt ( weitere Details und Optionen finden Sie in der Dokumentation ):
Jetzt haben Sie einen Windows-Dienst Ihres Jar, der mit Ihrem eigenen Symbol und Namen ausgeführt wird! Sie können die Überwachungsdatei auch starten und sie wird in der Taskleiste mit Ihrem eigenen Symbol und Namen ausgeführt.
quelle
Ein einfacher Weg ist der NSSM Wrapper Wrapper ( siehe meinen Blogeintrag ).
quelle
Eine weitere Option ist WinRun4J . Dies ist ein konfigurierbarer Java-Launcher, der gleichzeitig als Windows-Diensthost fungiert (32- und 64-Bit-Version). Es ist Open Source und es gibt keine Einschränkungen für seine Verwendung.
(vollständige Offenlegung: Ich arbeite an diesem Projekt).
quelle
Eine weitere Antwort ist ein weiterer Java Service Wrapper . Dies scheint eine gute Alternative zu Java Service Wrapper zu sein, da die Lizenzierung besser ist. Es soll auch einfach sein, von JSW zu YAJSW zu wechseln. Für mich war Windows, das für Windows-Server brandneu war und versuchte, eine Java-App als Dienst zum Laufen zu bringen, sehr einfach zu bedienen.
Einige andere habe ich gefunden, aber am Ende nicht verwendet:
quelle
Ich denke, der Java Service Wrapper funktioniert gut. Beachten Sie, dass es drei Möglichkeiten gibt , Ihre Anwendung zu integrieren. Es klingt so, als würde Option 1 am besten für Sie funktionieren, da Sie den Code nicht ändern möchten. Die Konfigurationsdatei kann etwas verrückt werden, aber denken Sie daran, dass (für Option 1) das Programm, das Sie starten und für das Sie Argumente angeben, das Hilfsprogramm ist, das dann Ihr Programm startet. Sie haben eine Beispielkonfigurationsdatei dafür.
quelle
Wenn Sie das Gradle Build Tool verwenden, können Sie mein Windows-Service-Plugin ausprobieren , das die Verwendung von Apache Commons Daemon Procrun erleichtert .
Um eine Java Windows-Dienstanwendung mit dem Plugin zu erstellen, müssen Sie mehrere einfache Schritte ausführen.
Erstellen Sie eine Hauptserviceklasse mit der entsprechenden Methode.
Fügen Sie das Plugin in Ihre
build.gradle
Datei ein.Das gleiche Skript-Snippet für den neuen, inkubierenden Plugin-Mechanismus, der in Gradle 2.1 eingeführt wurde:
Konfigurieren Sie das Plugin.
Führen Sie die Gradle-Task createWindowsService aus, um eine Windows-Dienstverteilung zu erstellen.
Das ist alles, was Sie tun müssen, um einen einfachen Windows-Dienst zu erstellen. Das Plugin lädt automatisch Binärdateien von Apache Commons Daemon Procrun herunter, extrahiert diese Binärdateien in das Dienstverteilungsverzeichnis und erstellt Batchdateien für die Installation / Deinstallation des Dienstes.
Im
${project.buildDir}/windows-service
Verzeichnis finden Sie ausführbare Dienstdateien, Batch-Skripte für die Installation / Deinstallation des Dienstes und alle Laufzeitbibliotheken. So installieren Sie den Dienstlauf<project-name>-install.bat
und wenn Sie den Dienstlauf deinstallieren möchten<project-name>-uninstall.bat
. Verwenden Sie zum Starten und Stoppen des Dienstes die<project-name>w.exe
ausführbare Datei.Beachten Sie, dass der Start des Methodenbehandlungsdienstes einen separaten Thread erstellen und starten sollte, um die Verarbeitung auszuführen, und dann zurückkehren sollte. Die Hauptmethode wird von verschiedenen Threads aufgerufen, wenn Sie den Dienst starten und stoppen.
Weitere Informationen finden Sie über das Plugin und Apache Commons Daemon Procrun.
quelle
JavaService ist LGPL. Es ist sehr einfach und stabil. Sehr empfehlenswert.
quelle
Mit Java 8 können wir dieses Szenario ohne externe Tools bewältigen. Javapackager mit Java 8 Tool bietet eine Option zum Erstellen eigenständiger Anwendungspakete:
-nativer Typ Generiert eigenständige Anwendungspakete (falls möglich). Verwenden Sie die Option -B, um den verwendeten Bundlern Argumente bereitzustellen. Wenn Typ angegeben ist, wird nur ein Bündel dieses Typs erstellt. Wenn kein Typ angegeben ist, wird alles verwendet.
Die folgenden Werte gelten für den Typ:
Im Falle von Windows beziehen Sie sich auf das folgende Dokument. Wir können je nach Bedarf msi oder exe erstellen.
quelle
Ein ziemlich guter Vergleich verschiedener Lösungen ist verfügbar unter: http://yajsw.sourceforge.net/#mozTocId284533
Persönlich wie launch4j
quelle
Es ist einfach, da Sie eine Verknüpfung eingeben müssen
Windows 7
C:\users\All Users\Start Menu\Programs\Startup
(Admin) oderUser home directory(%userProfile%)
Windows 10: In Ausführung
shell:startup
in seiner Eigenschaft -> Verknüpfung -> Ziel ->
java.exe -jar D:\..\runJar.jar
HINWEIS: Dies wird erst ausgeführt, nachdem Sie sich angemeldet haben
Mit Admin Recht
sc create serviceName binpath= "java.exe -jar D:\..\runJar.jar"
Erstellt einen Windows-DienstWenn Sie Timeout verwenden,
cmd /c D:\JAVA7~1\jdk1.7.0_51\bin\java.exe -jar d:\jenkins\jenkins.war
aber auch damit erhalten Sie Timeout, aber im Hintergrund wird java.exe gestartet. Checken Sie den Task-Manager einHINWEIS: Dies wird beim Start der Windows-Anmeldung ausgeführt (vor der Anmeldung, basierend auf dem Dienst '
Startup Type
').Detaillierte Erläuterung zum Erstellen des Windows-Dienstes
quelle
Verwenden Sie " winsw ", das für Glassfish v3 geschrieben wurde, aber im Allgemeinen gut mit Java-Programmen funktioniert.
Erforderliche .NET-Laufzeit installiert.
quelle
Ich habe JavaService bereits mit gutem Erfolg verwendet. Es wurde seit ein paar Jahren nicht mehr aktualisiert, war aber damals ziemlich solide, als ich es benutzte.
quelle
Die Lizenzierung für den Java Service Wrapper hat mir nicht gefallen. Ich habe mich für ActiveState Perl entschieden, um einen Dienst zu schreiben, der die Arbeit erledigt.
Ich dachte darüber nach, einen Dienst in C # zu schreiben, aber meine zeitlichen Einschränkungen waren zu eng.
quelle
Ich benutze immer nur sc.exe (siehe http://support.microsoft.com/kb/251192 ). Es sollte unter XP von SP1 installiert werden. Wenn es nicht zu Vista gehört, können Sie es mit dem Vista Resource Kit herunterladen.
Ich habe mit Java nichts allzu Kompliziertes gemacht, aber die Verwendung eines vollständig qualifizierten Befehlszeilenarguments (x: \ java.exe ....) oder das Erstellen eines Skripts mit Ant, das Abhängigkeiten enthält und Parameter festlegt, funktioniert für mich einwandfrei.
quelle
Eine weitere gute Option ist FireDaemon . Es wird von einigen großen Geschäften wie der NASA, IBM usw. verwendet. Eine vollständige Liste finden Sie auf der Website.
quelle
Ich benötige dies derzeit, um eine Eclipse-basierte Anwendung auszuführen, aber ich muss zuerst einige Variablen festlegen, die für diese Anwendung lokal sind. sc.exe erlaubt nur ausführbare Dateien, aber keine Skripte, daher habe ich mich an autoexnt.exe gewandt, das Teil des Windows 2003-Ressourcen-Kits ist . Es beschränkt den Dienst auf eine einzelne Batchdatei, aber ich benötige nur ein Batch-Skript, um in einen Dienst konvertiert zu werden.
ciao!
quelle
Exe4j ist eine sehr gute Option, obwohl es nicht kostenlos ist. Probieren Sie es bei Exe4j aus. Im Assistenten zum Erstellen der EXE-Datei haben Sie die Möglichkeit, einen Dienst zu erstellen.
quelle