2009-10-24 6 views
42

Ich habe eine ausführbare JAR-Datei. Ist es möglich, einen Windows-Dienst dieser JAR zu erstellen? 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 speichern.Wie Windows-Dienst von Java-Jar zu erstellen?

+1

Nicht in der Registrierung auch?Warum sollten Sie es als Service wünschen? –

+0

@ o.k.w ist richtig, wenn Sie Windows-Dienst erstellen, wird es Eintrag in der Registrierung erstellen. –

+0

Ich denke, dieser Benutzer bedeutete "als Dienst, nicht von den Start-Registry-Schlüssel als non-Service ausgeführt" –

Antwort

6

Tanuki geändert Lizenz von jsw vor einiger Zeit mit, wenn ich ein Projekt beginnen, würde ich andere Java Service Wrapper, http://yajsw.sourceforge.net/, die mehr verwenden Dennoch ist oder weniger eine Open-Source-Implementierung, die JWS nachahmt, dann darauf aufbaut und sie noch weiter verbessert.

EDIT: Ich habe YAJSW seit mehreren Jahren auf mehreren Plattformen (Windows, mehrere Linux ...) und es ist großartig, die Entwicklung läuft.

9

Ich habe mit Apache Commons Daemon experimentiert. Es unterstützt Windows (Procrun) und Unix (Jsvc). Advanced Installer hat eine Java Service tutorial mit einem Beispielprojekt zum Download. Wenn Sie ihr javaservice.jar als Windows-Dienst ausführen, können Sie es mit "telnet 4444" testen. Ich habe ihr Beispiel verwendet, weil mein Fokus darauf war, einen Java-Windows-Dienst zum Laufen zu bringen, nicht Java zu schreiben.

+0

Für einen Windows-Dienst [WinRun4j] (http://winrun4j.sourceforge.net/) ist auch ein guter Kandidat. Es kann als Java Launcher oder Service Wrapper verdoppeln – mcdon

2

Mit procrun Sie müssen prunsrv auf 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

  • laufen diese aus dem gleichen Verzeichnis vermuten wo das Glas und prunsrv.exe ist
  • das Glas hat seine Arbeit MANIFEST.MF
  • und Sie haben Shutdown-Hooks in JVM registriert (für Beispiel mit context.registerShutdownHook() im Frühling) ...
  • keine relativen Pfade für Dateien außerhalb des Jars verwenden (zum Beispiel log4j sollte mit log4j.appender.X.File = $ {app.home}/logs verwendet werden /my.log oder etwas ähnlich)

überprüfen Sie die procrun manual und this tutorial für weitere Informationen.

+0

Gibt es ein Beispiel, das du teilen kannst? –

+0

ja: siehe oben :-) was brauchst du noch? – BTakacs

+0

Dank BTakacs, habe ich bereits Ihr Tutorial überprüft und es hat gut funktioniert. Aber leider hat das nicht gelöst was ich machen wollte. Ich versuche das jetzt von C# zu erreichen. –

36

Die einfachste Lösung, die ich ist die Non-Sucking Service Manager

Nutzungs

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

Ich habe das gleiche und es erfolgreich installiert, aber sobald ich es ausführen, heißt es 'unerwarteten Status SERVICE-PAUSED in Antwort auf START-Kontrolle " – aneela

+0

@kopernik, gleiche Sache passiert auch für mich .. viele Hilfe bitte .. – Shakthi

+0

Das gleiche Problem wie Sie erwähnt. Irgendeine Idee was falsch ist? –

9

Verwendung nssm.exe wäre aber nicht vergessen, die AppDirectory oder alle erforderlichen Bibliotheken oder Ressourcen festlegen nicht zugänglich sein, so weit zu dieser . Standardmäßig setzt nssm das aktuelle Arbeitsverzeichnis auf das der Anwendung, java.exe, nicht auf das jar. So tun dies eine Batch-Skript zu erstellen:

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 der Dienst angehalten Problem beheben.

+1

Das ist gut ... Sie sollten es als Kommentar zu Koperniks Antwort hinzufügen. –

+0

Das Einrichten des AppDirectory nach der Erstellung des Dienstes ist in meinem Fall fehlgeschlagen. Aber Sie können eine GUI mit 'nssm install ' starten und das AppDirectory sowie andere nützliche Parameter wie Protokolldateien dort einstellen und den Service auf einmal erstellen – JCvanDamme

Verwandte Themen