it-swarm-eu.dev

So erstellen Sie einen Windows-Dienst aus Java App

Ich habe gerade eine Java Anwendung geerbt, die als Dienst auf XP und Vista installiert werden muss. Es ist ungefähr 8 Jahre her, seit ich Windows verwendet habe in irgendeiner Form und ich musste noch nie einen Service erstellen, geschweige denn aus so etwas wie einer Java App (Ich habe ein Jar für die App und ein einziges Dependency Jar - log4j). Was ist die Magie, die erforderlich ist, um diesen Dienst als Dienst auszuführen? Ich habe die Quelle, sodass Codeänderungen möglich sind, obwohl sie vorzugsweise vermieden werden.

211
ideasculptor

Ich hatte etwas Glück mit dem Java Service Wrapper

66
sblundy

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 ein ausführlicher Artikel mit einem Arbeitsbeispiel.

Außerdem können Sie sich die Datei bin\service.bat in Apache Tomcat ansehen, um eine Vorstellung davon zu erhalten, wie der Dienst eingerichtet wird. In Tomcat benennen sie die Procrun-Binärdateien um (prunsrv.exe -> Tomcat6.exe, prunmgr.exe -> Tomcat6w.exe).

Etwas, mit dem ich mit Procrun zu kämpfen hatte, müssen Ihre Start- und Stoppmethoden die Parameter akzeptieren (String [] argv). Zum Beispiel würden "start (String [] argv)" und "stop (String [] argv)" funktionieren, aber "start ()" und "stop ()" würden Fehler verursachen. Wenn Sie diese Aufrufe nicht ändern können, sollten Sie eine Bootstrapper-Klasse erstellen, die diese Aufrufe an Ihre Anforderungen anpasst.

95
mcdon

Mit Apache Commons Daemon können Sie jetzt einen benutzerdefinierten ausführbaren Namen und ein benutzerdefiniertes Symbol haben! Sie können auch einen benutzerdefinierten Windows Tray Monitor mit erhalten Deinen eigenen Namen und Icon!

Ich habe jetzt meinen Dienst mit meinem eigenen Namen und Symbol (prunsrv.exe) ausgeführt, und der Taskleistemonitor (prunmgr.exe) hat auch meinen eigenen benutzerdefinierten Namen und Symbol!

  1. Laden Sie die Apache Commons Daemon-Binärdateien herunter (Sie benötigen prunsrv.exe und prunmgr.exe).
  2. Benenne sie um in MyServiceName.exe und MyServiceNamew.exe beziehungsweise.
  3. Laden Sie WinRun4J herunter und verwenden Sie das RCEDIT.exe Das mitgelieferte Programm zum Ändern der Apache-Programmdatei, 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 (siehe Dokumentation für weitere Details und Optionen):

    > 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 für Ihr Jar, der mit Ihrem eigenen Symbol und Namen ausgeführt wird! Sie können die Monitordatei auch starten und sie wird in der Taskleiste mit Ihrem eigenen Symbol und Namen ausgeführt.

54
11101101b

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

26

Eine weitere Option ist WinRun4J . Dies ist ein konfigurierbarer Java Launcher, der gleichzeitig als Windows-Dienst-Host fungiert (32- und 64-Bit-Version). Es ist Open Source und unterliegt keinen Einschränkungen für die Verwendung.

(vollständige Offenlegung: Ich arbeite an diesem Projekt).

25
Peter Smith

Eine weitere Antwort ist Yet Another Java Service Wrapper , dies scheint eine gute Alternative zu Java Service Wrapper zu sein, da es eine bessere Lizenzierung hat. Es soll auch einfach sein, von JSW zu YAJSW zu wechseln. Natürlich war es für mich sehr einfach, Windows-Server neu zu machen und zu versuchen, eine Java App als Dienst auszuführen .

Einige andere, die ich gefunden habe, aber am Ende nicht verwendet habe:

  • Java Service Launcher Ich habe dies nicht verwendet, weil es komplizierter aussah, als mit YAJSW zu arbeiten. Ich denke nicht, dass dies ein Wrapper ist.
  • JSmooth Das Erstellen von Windows-Diensten ist nicht das primäre Ziel, aber kann durchgeführt werden . Ich habe das nicht benutzt, weil es seit 2007 keine Aktivität mehr gibt.
17
atomicules

Ich denke, der Java Service Wrapper funktioniert gut. Beachten Sie, dass es drei Möglichkeiten gibt , Ihre Anwendung zu integrieren . Es hört sich so an, 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.

6
Ed Thomas

Wenn Sie Gradle Build Tool verwenden, können Sie mein Windows-Service-Plugin ausprobieren, was die Verwendung von Apache Commons Daemon Procrun erleichtert.

Um eine Java Windows Service-Anwendung mit dem Plugin zu erstellen, müssen Sie einige einfache Schritte ausführen.

  1. Erstellen Sie eine Hauptdienstklasse 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 Ihr build.gradle Datei.

    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 in Gradle 2.1 eingeführten neuen Inkubations-Plugin-Mechanismus:

    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 createWindowsService gradle 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 die 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 Service Executables, Batch-Skripte zur Installation/Deinstallation des Service und alle Laufzeitbibliotheken. Um den Dienst zu installieren, führen Sie <project-name>-install.bat und wenn Sie den Dienst deinstallieren möchten, führen Sie <project-name>-uninstall.bat. Zum Starten und Beenden des Dienstes verwenden Sie <project-name>w.exe ausführbar.

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

Für weitere Informationen lesen Sie bitte das Plugin und Apache Commons Daemon Procrun.

5

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

4
NT_

Mit Java 8 können wir dieses Szenario ohne externe Tools bewältigen. Javapackager Tool mit Java 8 bietet eine Option zum Erstellen von Self enthaltene Anwendungspakete:

-nativer Typ Generiert unabhängige Anwendungspakete (falls möglich). Verwenden Sie die Option -B, um Argumente für die verwendeten Bundler bereitzustellen. Wenn type angegeben ist, wird nur ein Bundle 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 doc wir können nach Bedarf msi oder exe erstellen.

exe: Generates a Windows .exe package.
msi: Generates a Windows Installer package.
4
Steephen

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

Erforderliche .NET-Laufzeit installiert.

Die Lizenzierung für den Java Service Wrapper hat mir nicht gefallen. Ich habe mit ActiveState Perl einen Dienst geschrieben, der die Arbeit erledigt.

Ich dachte darüber nach, einen Dienst in C # zu schreiben, aber meine Zeitbeschränkungen waren zu eng.

2
Hugh Buchanan

Ich benutze immer nur sc.exe (siehe http://support.Microsoft.com/kb/251192 ). Es sollte auf XP von SP1 installiert werden, und wenn es nicht in Ihrem Vista-Geschmack ist, 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 die Erstellung eines Skripts mit Ant, um Abhängigkeiten und festgelegte Parameter einzuschließen, funktioniert für mich einwandfrei.

2
Kevin

es ist einfach, da Sie eine Verknüpfung eingeben müssen

Windows 7 C:\users\All Users\Start Menu\Programs\Startup (Admin) oder User home directory(%userProfile%)

Windows 10: In Run Shell:startup

in seiner Eigenschaft -> Verknüpfung -> Ziel -> Java.exe -jar D:\..\runJar.jar

HINWEIS: Dies wird nur 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 eine Zeitüberschreitung erhalten , verwenden Sie cmd /c D:\Java7~1\jdk1.7.0_51\bin\Java.exe -jar d:\jenkins\jenkins.war, aber selbst dann erhalten Sie eine Zeitüberschreitung, 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 Erklärung zum Erstellen eines Windows-Dienstes

2
Ravi Parekh

Ein ziemlich guter Vergleich verschiedener Lösungen ist verfügbar unter: http://yajsw.sourceforge.net/#mozTocId2845

Persönlich wie launch4j

2
pushNpop

Ich habe JavaService zuvor mit gutem Erfolg verwendet. Es wurde seit ein paar Jahren nicht mehr aktualisiert, war aber ziemlich solide, als ich es benutzte.

2
Jason

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 lässt nur ausführbare Dateien, aber keine Skripte zu. Daher habe ich mich an autoexnt.exe gewandt, das Teil des Windows 2003 Resource Kit ist. Es beschränkt den Dienst auf eine einzelne Batchdatei, aber ich benötige nur ein Batchskript, um in einen Dienst konvertiert zu werden.

ciao!

1
ramfree17

Eine andere 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.

1
Andrew Swan