So erstellen Sie einen Windows-Dienst aus der Java-App

220

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.

Ideenbildhauer
quelle
Ein anderer Vorschlag stackoverflow.com/a/9262081/381897
bhdrkn
1
Der Vollständigkeit halber : Hier steht unter serverfault.com/a/259195 , dass die App auf Service Control Manager-Rückrufe reagieren muss. Lesen Sie dieses Tutorial es Procrun verwendet ticklingmind.blogspot.com/2010/03/...
Broken_Window
Andere Antwort stackoverflow.com/questions/5953525/…
Ravi Parekh

Antworten:

69

Ich hatte etwas Glück mit dem Java Service Wrapper

sblundy
quelle
11
Java Service Wrapper sieht sehr nützlich aus. Aber ich habe mir die Feature-Liste angesehen. Sie müssen sich nur bewusst sein, dass die Community-Version nicht für die Verwendung auf dem Server lizenziert ist.
Brian Matthews
Das könnte ein Problem sein. Es war vor ein paar Jahren, als ich es benutzt habe. Vermutlich haben sie beschlossen, eine Gebühr zu erheben.
sblundy
Dieser Wrapper wird von vielen Open-Source-Projekten verwendet, darunter mehrere von Jakarta Apache, z. B. ActiveMQ.
Todd
7
wrapper.tanukisoftware.org/doc/english/licenseCommunity.html Verwendung durch geschlossene Quellen Die GPL beschränkt nicht die Entwicklung privater Software für den internen Gebrauch, die von der Software unter der GPL abhängt, solange diese Software niemals ohne die vollständige Quelle von verteilt wird Die gesamte Anwendung steht allen Benutzern zur Verfügung. Während wir Unternehmens- und Regierungsbenutzer ermutigen, entweder eine Server- oder eine Entwicklungslizenzvereinbarung zu verwenden, ist die Community-Lizenzvereinbarung akzeptabel, solange die Anwendung für den internen Gebrauch bestimmt ist oder immer zusammen mit ihrer vollständigen src verteilt wird.
Vladimir
1
@ Vladimir Tanuki Wrapper ist nicht mehr Open Source für 64bit Arch
Gerrytan
100

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.

mcdon
quelle
Mit Reflection könnten Sie wahrscheinlich das Problem umgehen, das Sie in Ihrem letzten Absatz angegeben haben. Außerdem ist der Apache Commons Daemon der einzige mir bekannte Wrapper, der vorgefertigte 64-Bit-Binärdateien zur freien Verwendung enthält.
Djangofan
Sie benötigen einen Wagenrücklauf zwischen den einzelnen JVM-Optionen. Wenn Sie beispielsweise in derselben Zeile -Dopt1 = a -Dopt2 = b haben, funktioniert dies möglicherweise nicht. Um das Problem zu beheben, müssen Sie schreiben --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.
Sydney
Der Artikel, über den Sie gesprochen haben, existiert nicht mehr ... Haben Sie noch einen Weg dorthin? Ich habe Probleme, Apache Commons Daemon dazu zu bringen, das zu tun, was ich brauche.
11101101b
3
@ 11101101b, Apache scheint den Mut des Artikels an seine eigene Wiki-Seite angehängt zu haben ...
Lucas
@community Wiki, ich habe Apache Commons Daemon für 64-Bit-Windows-Computer verwendet, es hat den Dienst erfolgreich hinzugefügt. Während ich die gleichen Prozesse für 32-Bit-Windows 7-Computer verwende, kann kein Dienst hinzugefügt werden.
Shakthi
59

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!

  1. Laden Sie die Binärdateien des Apache Commons Daemon herunter (Sie benötigen prunsrv.exe und prunmgr.exe).
  2. Benennen Sie sie zu sein MyServiceName.exeund MyServiceNamew.exejeweils.
  3. 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:

    > RCEDIT.exe /I MyServiceName.exe customIcon.ico
    > RCEDIT.exe /I MyServiceNamew.exe customTrayIcon.ico
  4. Installieren Sie nun Ihren Windows-Dienst wie folgt ( weitere Details und Optionen finden Sie in der Dokumentation ):

    > MyServiceName.exe //IS//MyServiceName \
      --Install="C:\path-to\MyServiceName.exe" \
      --Jvm=auto --Startup=auto --StartMode=jvm \
      --Classpath="C:\path-to\MyJarWithClassWithMainMethod.jar" \
      --StartClass=com.mydomain.MyClassWithMainMethod
  5. 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.

11101101b
quelle
1
Ich habe alles gemäß Ihrem How to gemacht, aber es ändert nichts am Systray-Symbol. Irgendeine Idee warum?
outofBounds
Sorry @outofBounds, ich habe deinen Kommentar erst jetzt gesehen. Das Programm RCEDIT.exe ändert das Symbol Ihrer ausführbaren Dienstdatei. Stellen Sie sicher, dass Sie eine gültige .ico-Datei mit jeder richtig definierten Größe haben. Sie können hier sehen, wie Sie eine richtige .ico-Datei erstellen: stackoverflow.com/questions/4354617/…
11101101b
2
Nur damit Sie wissen, können Sie keine Leerzeichen im Dienstnamen haben.
11101101b
1
Ja @Shakthi es funktioniert gut unter 32 und 64-Bit Windows XP, 7, 8, 8.1, Server 2003, 2008 und 2012.
11101101b
1
Ja, @Syamsoul Azrein, es funktioniert hervorragend auf 10 und jeder Server Edition.
11101101b
31

Ein einfacher Weg ist der NSSM Wrapper Wrapper ( siehe meinen Blogeintrag ).

Giordano Maestro
quelle
7
NSSM FELSEN! Ich mache einfach Wrapper sogar aus meinem Java-Programm. Einfach, leicht, funktioniert - 100kb Glück! Danke dir!
Cynepnaxa
1
Gibt es ein Beispiel dafür, wie Sie mit NSSM Wrapper die Java-App-Instanz (ich verwende HelioSearch) als Windows-Dienst im Hintergrund beim Systemstart starten können?
Krunal
@GiordanoMaestro Ihr Blogeintrag ist nicht mehr zugänglich. Hast du noch einen Link?
Matthieu
2
Im Vergleich zu Apache Commons Daemon, wrapper.tanukisoftware.org und yajsw war NSSM bei weitem die schnellste und einfachste Option, um eine einfache Java-App in einen Windows-Dienst
Jeffrey Knight
Ich versuche, NSSM zu verwenden, um meine ausführbare Spring Boot-JAR auszuführen. Ich habe den Fehler "Unerwarteter Status SERVICE_PAUSED als Antwort auf die START-Steuerung" erhalten.
Kiran Kumar
26

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).

Peter Smith
quelle
3
Danke dafür. Ich habe YAJWS ausprobiert und zuerst hatte ich Angst vor dem Download von 19 MB. Nachdem ich die Anweisungen befolgt hatte, wurde "Fehleranalyse-Befehlszeile" angezeigt. Ich habe mir PROCRUN angesehen und es ist einfach zu umständlich für eine schnelle Einrichtung. INSTSRV / SRVANY erfordert Registrierungsänderungen! Launch4J packt eine JAR in eine EXE-Datei, wodurch Bereitstellungen kompliziert werden. WinRun4J war eine perfekte Passform. Der einzige Nachteil ist, dass eine spezielle Klasse für die Arbeit als Dienst erforderlich ist (anstatt einfach die Standardhauptklasse aufzurufen). Aber insgesamt ist es zu 99% perfekt.
Fernacolo
2
Zu Ihrer Information, die neueste Version hat einen Wrapper für eine Standard-Hauptklasse.
Peter Smith
Hallo, können Sie ein Beispiel geben, das erklärt, wie man das benutzt? Ich möchte es verwenden, um die HelioSearch-Instanz als Hintergrund-Windows-Dienst beim Systemstart zu starten.
Krunal
17

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:

Atome
quelle
+1 von mir, da dies die schnellste Lösung für mich "out of the box" war und keine Änderung der Java-App erforderlich war, was ein klares Plus ist.
Grüner Tag
Ich fand diese sehr überzeugende Vergleichstabelle, in der YAJSW mit einigen anderen gängigen Service-Wrappern verglichen wurde. yajsw.sourceforge.net/#mozTocId284533
Green
6

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.

Ed Thomas
quelle
5

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.

  1. Erstellen Sie eine Hauptserviceklasse mit der entsprechenden Methode.

    public class MyService {
    
        public static void main(String[] args) {
            String command = "start";
            if (args.length > 0) {
                command = args[0];
            }
            if ("start".equals(command)) {
                // process service start function
            } else {
                // process service stop function
            }
        }
    
    }
  2. Fügen Sie das Plugin in Ihre build.gradleDatei ein.

    buildscript {
      repositories {
        maven {
          url "https://plugins.gradle.org/m2/"
        }
      }
      dependencies {
        classpath "gradle.plugin.com.github.alexeylisyutenko:windows-service-plugin:1.1.0"
      }
    }
    
    apply plugin: "com.github.alexeylisyutenko.windows-service-plugin"

    Das gleiche Skript-Snippet für den neuen, inkubierenden Plugin-Mechanismus, der in Gradle 2.1 eingeführt wurde:

    plugins {
      id "com.github.alexeylisyutenko.windows-service-plugin" version "1.1.0"
    }
  3. Konfigurieren Sie das Plugin.

    windowsService {
      architecture = 'amd64'
      displayName = 'TestService'
      description = 'Service generated with using gradle plugin'   
      startClass = 'MyService'
      startMethod = 'main'
      startParams = 'start'
      stopClass = 'MyService'
      stopMethod = 'main'
      stopParams = 'stop'
      startup = 'auto'
    }
  4. 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-serviceVerzeichnis 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.batund wenn Sie den Dienstlauf deinstallieren möchten <project-name>-uninstall.bat. Verwenden Sie zum Starten und Stoppen des Dienstes die <project-name>w.exeausfü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.

Alexey Lisyutenko
quelle
Unterschätzte Antwort!
TaylanUB
4

JavaService ist LGPL. Es ist sehr einfach und stabil. Sehr empfehlenswert.

NT_
quelle
4

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:

-native type
Generate self-contained application bundles (if possible). Use the -B option to provide arguments to the bundlers being used. If type is specified, then only a bundle of this type is created. If no type is specified, all is used.

The following values are valid for type:

all: Runs all of the installers for the platform on which it is running, and creates a disk image for the application. This value is used if type is not specified.
installer: Runs all of the installers for the platform on which it is running.
image: Creates a disk image for the application. On OS X, the image is the .app file. On Linux, the image is the directory that gets installed.
dmg: Generates a DMG file for OS X.
pkg: Generates a .pkg package for OS X.
mac.appStore: Generates a package for the Mac App Store.
rpm: Generates an RPM package for Linux.
deb: Generates a Debian package for Linux.

Im Falle von Windows beziehen Sie sich auf das folgende Dokument. Wir können je nach Bedarf msi oder exe erstellen.

exe: Generates a Windows .exe package.
msi: Generates a Windows Installer package.
Steephen
quelle
4
Diese Antwort geht nicht auf die Frage ein. Der Javapackager kann nicht verwendet werden, um einen Windows-Dienst direkt zu erstellen, sondern um eine eigenständige ausführbare Datei zu erstellen, die z. B. den JRE und andere Ressourcen enthält.
Tobias_
3

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-Dienst

Wenn Sie Timeout verwenden, cmd /c D:\JAVA7~1\jdk1.7.0_51\bin\java.exe -jar d:\jenkins\jenkins.waraber auch damit erhalten Sie Timeout, aber im Hintergrund wird java.exe gestartet. Checken Sie den Task-Manager ein

HINWEIS: 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

Ravi Parekh
quelle
3

Verwenden Sie " winsw ", das für Glassfish v3 geschrieben wurde, aber im Allgemeinen gut mit Java-Programmen funktioniert.

Erforderliche .NET-Laufzeit installiert.

Thorbjørn Ravn Andersen
quelle
Inzwischen befindet sich hier die aktuelle Version (gepflegt von dem bekannten Kohsuke Kawaguchi) .
FrVaBe
Es scheint, dass er es nach Version 1.9 auf Github verschoben hat (höchstwahrscheinlich, als er von Oracle zu Cloudbees wechselte).
Thorbjørn Ravn Andersen
2

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
GForge wurde eingestellt
lww
2

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.

Hugh Buchanan
quelle
Können Sie den Beispiel-Hack bereitstellen, den Sie mit "perl" durchgeführt haben ..!
peaceUser
2

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.

Kevin
quelle
1
Das ermöglicht es Ihnen, etwas als Dienst zu starten, aber nach meinem Verständnis würde es dann getrennt, dh Sie könnten es nicht über Dienste stoppen oder automatisch neu starten usw. Ich könnte mich jedoch völlig irren - habe gerade erst angefangen, dies zu untersuchen.
Atomicules
1

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.

Andrew Swan
quelle
1

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
-1

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.

RAM
quelle