it-swarm.com.de

Wie erstellt man einen Windows-Dienst aus Java-Jar?

Ich habe eine ausführbare JAR-Datei. Kann ein Windows-Dienst von diesem JAR erstellt werden? Eigentlich möchte ich das nur beim Start ausführen, aber ich möchte diese JAR-Datei weder in meinem Startordner noch in der Registrierung ablegen.

50
Rakesh Juyal

In diesem Artikel erfahren Sie alles, was Sie wissen müssen: "Java-Anwendungen als Windows-Dienst ausführen" ; es erwähnt " Java Service Wrapper " (es gibt eine Community Edition namens YAJSW )

14
Adrian

Die einfachste Lösung, die ich bisher gefunden habe, ist der Non-Sucking Service Manager

Verwendung wäre 

nssm install <servicename> "C:\Program Files\Java\jre7\Java.exe" "-jar <path-to-jar-file>"
42
kopernik

Verwenden Sie nssm.exe. Denken Sie jedoch daran, AppDirectory festzulegen, da auf alle erforderlichen Bibliotheken oder Ressourcen nicht zugegriffen werden kann. Standardmäßig setzt nssm das aktuelle Arbeitsverzeichnis auf das der Anwendung, Java.exe, und nicht auf die JAR-Datei.

    pushd <path-to-jar>
    nssm.exe install "<service-name>" "<path-to-Java.exe>" "-jar <name-of-jar>"
    nssm.exe set "<service-name>" AppDirectory "<path-to-jar>"

Dies sollte das Problem mit angehaltenen Diensten beheben.

14
gcerkez

Ich habe mit Apache Commons Daemon experimentiert. Es unterstützt Windows ( Procrun ) und Unix ( Jsvc ). Advanced Installer enthält ein Java Service-Tutorial mit einem Beispielprojekt zum Herunterladen. Wenn Sie javaservice.jar als Windows-Dienst ausführen, können Sie es mit "telnet 4444" testen. Ich habe ihr Beispiel verwendet, weil ich mich darauf konzentrierte, einen Java-Windows-Dienst zum Laufen zu bringen und nicht Java zu schreiben.

10
mcdon

Tanuki änderte vor einiger Zeit die Lizenz von Jsw. Wenn ich ein Projekt beginnen wollte, würde ich Yet Another Java Service Wrapper verwenden, http://yajsw.sourceforge.net/ , das mehr oder weniger eine Open Source-Implementierung ist ahmt JWS nach, baut darauf auf und verbessert es noch weiter.

EDIT: Ich verwende YAJSW seit mehreren Jahren auf mehreren Platorms (Windows, mehrere Linux ...) und es ist großartig, die Entwicklung ist im Gange.

7
Persimmonium

Mit procrun müssen Sie prunsrv in das Anwendungsverzeichnis ( download ) kopieren und eine install.bat wie folgt erstellen:

set PR_PATH=%CD%
SET PR_SERVICE_NAME=MyService
SET PR_JAR=MyService.jar
SET START_CLASS=org.my.Main
SET START_METHOD=main
SET STOP_CLASS=Java.lang.System
SET STOP_METHOD=exit
rem ; separated values
SET STOP_PARAMS=0
rem ; separated values
SET JVM_OPTIONS=-Dapp.home=%PR_PATH%
prunsrv.exe //IS//%PR_SERVICE_NAME% --Install="%PR_PATH%\prunsrv.exe" --Jvm=auto --Startup=auto --StartMode=jvm --StartClass=%START_CLASS% --StartMethod=%START_METHOD% --StopMode=jvm --StopClass=%STOP_CLASS% --StopMethod=%STOP_METHOD% ++StopParams=%STOP_PARAMS% --Classpath="%PR_PATH%\%PR_JAR%" --DisplayName="%PR_SERVICE_NAME%" ++JvmOptions=%JVM_OPTIONS%

Ich vermute zu

  • führen Sie dies aus dem gleichen Verzeichnis aus, in dem sich jar und prunsrv.exe befinden
  • das Glas hat seine Arbeit MANIFEST.MF
  • und Sie haben Shutdown-Hooks in JVM registriert (zum Beispiel mit context.registerShutdownHook () in Spring) ...
  • keine relativen Pfade für Dateien außerhalb der jar-Datei verwenden (z. B. log4j sollte mit log4j.appender.X.File = $ {app.home} /logs/my.log oder ähnlich) verwendet werden

Weitere Informationen finden Sie in der Anleitung procrun manual und dieses Tutorial .

3
BTakacs

Wir verwenden dafür den Tanuki Service Wrapper . Es ist sehr konfigurierbar.

1
jqno

Eine weitere Option ist winsw: https://github.com/kohsuke/winsw/

Konfigurieren Sie eine XML-Datei, um den Dienstnamen, die auszuführenden Argumente usw. anzugeben. Verwenden Sie zur Installation das Exe. Beispiel xml: https://github.com/kohsuke/winsw/tree/master/examples

Ich ziehe dies dem nssm vor, weil es ein leichtes Exe ist; und die config-XML kann einfach in Quellcode freigegeben werden.

PS Der Dienst wird durch Ausführen von your-service.exe install installiert.

0
manyways