Stand: 2013-02-24

Play-Anwendung als Windows-Dienst installieren

Entgegen anders lautender Behauptungen, kann eine Play-Anwendung recht einfach als Windows-Dienst installiert und im Produktivbetrieb genutzt werden. Eine Installationsanleitung.

Die Play-Entwickler haben seit Version 2.0 keine Lust mehr, Windows für den Produktivbetrieb zu unterstützen, weil die dafür nötigen Skripte angeblich grausam in der Wartung wären. Tatsächlich ist der Produktivbetrieb unter Windows aber erfreulich einfach - wenn man weiß wie ...

Um eine Java-Anwendung unter Windows als Dienst auszuführen, ist eine vorgeschaltete .exe-Datei nötig, die wiederum die Java-Anwendung startet. Zu diesem Zweck gibt es verschiedene Lösungen; die besten Erfahrungen habe ich mit Apache Commons Daemon gemacht.

Mit folgenden Schritten kann eine Play-Anwendung als Windows-Dienst installiert werden:

  1. Erzeuge ein Programmpaket mit dem Befehl play dist
  2. Lege ein Verzeichnis für die Anwendung an: c:\irgendwo\anwendung
  3. Entpacke das lib-Verzeichnis aus dem soeben erstellen Programmpaket ein-play-projekt\dist\play-projekt-1.0-SNAPSHOT.zip in das Verzeichnis c:\irgendwo\anwendung .
  4. Lade das Programm prunsrv.exe herunter mit dem eine Java-Anwendung als Windows-Dienst ausgeführt werden kann.
  5. Kopiere die Datei prunsrv.exe in das Projektverzeichnis (oder ein beliebiges anderes).
  6. Installiere die Anwendung mit administrativen Rechten mit folgendem Befehl als Windows-Dienst:
    prunsrv.exe install "MeineAnwendung" \
    --Install="C:/pfad/zu/prunsrv.exe" \
    --JvmOptions=-Dpidfile.path=NUL
    --Jvm=auto \
    --Startup=auto \
    --StartMode=jvm \
    --Classpath="c:/irgendwo/anwendung/lib/*;" \
    --StartClass=play.core.server.NettyServer
  7. Starte den Dienst mit administrativen Rechten mit sc start MeineAnwendung.

--JvmOptions=-Dpidfile.path=NUL sorgt dafür, dass keine RUNNING_PID-Datei erzeugt wird. Diese Datei würde sonst einen Neustart des Dienstes verhindern, da sie nicht automatisch gelöscht wird und der Dienst den Start verweigert, wenn sie existiert. NUL ist das Windows-Gegenstück zu /dev/null unter Linux und sorgt dafür, dass die Datei ins Nichts geschrieben wird.

--Startup=auto bewirkt, dass der Dienst automatisch bei jedem Systemstart gestartet wird.

Wichtig sind die absoluten Pfadangaben, weil der installierte Dienst die Pfade sonst nicht finden kann.

Danach ist der Dienst in der Systemsteuerung verfügbar und kann von dort gestartet oder gestoppt werden. Alternativ kann der Dienst in der Eingabeaufforderung mit sc start|stop MeineAnwendung oder mit net start|stop MeineAnwendung gestartet und beendet werden. Der wesentliche Unterschied zwischen den Befehlen sc und net ist, dass sc nur ein Signal sendet und danach sofort zurückkehrt, während net wartet, bis die Aktion abgeschlossen ist. Das kann bei Verwendung in Skripten entscheidend sein.

Mit dem Befehl sc delete MeineAnwendung kannst du den Dienst wieder entfernen.

Weitere Information