Auf Windows-Systemen werden Java-Anwendungen in einer Befehlszeile ausgeführt. Dies macht es erforderlich, dass ein Benutzerkonto während dieser Zeit auf dem System eingeloggt ist und dass eine Eingabeaufforderung geöffnet ist und auf dem Desktop läuft.

Es gibt ein paar Nachteile bezüglich dies, die von Sicherheit bis zur Systemleistung reichen, die das Risiko beinhalten, dass ein Nutzer die falsche Taste in der Befehlszeile drücken und damit die Java-Anwendung "abschiessen", vorzeitig beenden könnte.

Java App Server

Was ist ein Dienst?

Windows hat die Fähigkeit, Anwendungen im Hintergrund als einen Dienst auszuführen, um diese Probleme zu lösen. Dienste werden beim System-Start gestartet und erfordern nicht, dass ein User eingeloggt ist. Dies erhöht in grossem Maße die Sicherheit und gesamte Systemstabilität, weil es für einen User nicht möglich ist, diese zu beenden, zu starten oder an diesen herumzubasteln, solange sie nicht Administrator sind.

Das Problem ist, dass Java selbst nicht als Dienst gestartet werden kann. Viele einfache Tools wie der Windows sc Befehl können genutzt werden, um Java als einen Dienst auszuführen, aber wenn der Nutzer etwas Einfaches tut, wie z.B. das Abmelden von der Maschine, bewirkt das, dass Java sich beendet.

Der Java Service Wrapper macht es nicht nur möglich, sondern macht es auch einfach, jede Java-Anwendung als einen Windows-Dienst auszuführen. Es fügt auch fortgeschrittene Failover-, Fehlerwiederherstellung, und Analyse-Features hinzu, um sicherzustellen, dass Ihre Anwendung eine möglichst lange Betriebszeit hat.

Einfache Java-Klasse HelloWorldServer

Für dieses Beispiel machen wir von der Nutzung der HelloWorldServer-Anwendung Gebrauch, die wir im Hintergrund laufen lassen und uns via telnet von einem Client-Rechner aus verbinden. Bitte sehen Sie in der kompletten Übersicht der Anwendung nach, um zu verstehen, wie wir die HelloWorldServer-Anwendung für dieses Beispiel erstellen können.

Ausser für den Fall, dass Sie das tatsächliche Beispiel ausführen wollen, genügt es andererseits zu sagen, dass es durch Nutzen der folgenden Java-Befehlszeile ausgeführt werden kann.

Das Beispiel ausführen:
java -classpath lib\classes HelloWorldServer

Wrapping der HelloWorldServer-Klasse

Der erste Schritt, um die HelloWorldServer-Klasse in einen Dienst umzuwandeln, ist es, den Java Service Wrapper so zu konfigurieren, dass dieser unsere Anwendung ausführen kann. Für die Mehrheit der Anwendungen kann dies getan werden, ohne dass jeglicher Java-Code geschrieben werden muss.

Verzeichnisstruktur

Der Wrapper ist sehr flexibel und kann installiert werden, um mit jeder Verzeichnisstruktur zu arbeiten. Für dieses Beispiel schlagen wir eine Verzeichnisstruktur vor, die sauber strukturiert ist und auch für ziemlich komplexe Anwendungen wieder benutzt werden kann. Bitte erstellen Sie die folgende Verzeichnisstruktur unter einem beliebigen Verzeichnis Ihrer Wahl neu. Wir nennen dies das Wurzelverzeichnis %EXAMPLE_HOME%. Dies ist eine Erweiterung der Verzeichnisstruktur, die in der HelloWorldServer-Übersicht beschrieben ist.

Verzeichnisstruktur:
%EXAMPLE_HOME%\
%EXAMPLE_HOME%\bin\
%EXAMPLE_HOME%\conf\
%EXAMPLE_HOME%\lang\
%EXAMPLE_HOME%\lib\
%EXAMPLE_HOME%\lib\classes\
%EXAMPLE_HOME%\logs\

Den Java Service Wrapper erhalten

Bitte laden Sie die neueste Version des Java Service Wrappers für Ihr Betriebssystem auf der Download-Seite herunter, und entpacken Sie diese in ein Verzeichnis Ihrer Wahl. Wir nennen das extrahierte Verzeichnis %WRAPPER_HOME%.

Kopieren der Wrapper-Dateien

Der Java Service Wrapper besteht aus 3 primären Komponenten. Die Wrapper-Programmdatei, eine jar-Datei, und eine interne native Bibliothek, die von der jar-Datei benutzt wird. Bitte kopieren Sie diese drei Dateien wie folgt:

Dateien kopieren:
%WRAPPER_HOME%\bin\wrapper.exe -> %EXAMPLE_HOME%\bin\wrapper.exe
%WRAPPER_HOME%\lib\wrapper.jar -> %EXAMPLE_HOME%\lib\wrapper.jar
%WRAPPER_HOME%\lib\wrapper.dll -> %EXAMPLE_HOME%\lib\wrapper.dll

Der Wrapper kann direkt oder über Batch-Dateien gesteuert werden. Diese Dateien werden auf der Start unter Windows-Seite genauer beschrieben. In diesem Beispiel werden wir den Wrapper direkt ausführen.

Internationalisierung / Lokalisierung:

Wenn Sie wünschen, den Wrapper in einer anderen Sprache als Englisch zu nutzen, kopieren Sie bitte die Lokalisierungsressourcen, indem Sie das komplette lang-Verzeichnis kopieren.

Kopieren Sie eine Datei:
%WRAPPER_HOME%\lang -> %EXAMPLE_HOME%\lang

Lizenzschlüssel:

Die Standard und Professional Editionen des Java Service Wrappers erfordern einen Lizenzschlüssel, um ausgeführt zu werden. Der Wrapper wird mit einem einfachen Lizenzschlüssel ausgeliefert, der Ihnen erlaubt, den Wrapper für 15 Minuten zu nutzen. Bitte kopieren Sie diesen soweit schon mal rüber. Sie können eine langfristige Testlizenz erhalten, indem Sie auf die Schaltfläche Kostenlos testenam Beginn einer Seite klicken.

Kopieren einer Datei:
%WRAPPER_HOME%\src\conf\wrapper-license-time.conf -> %EXAMPLE_HOME%\conf\wrapper-license.conf

Wrapper-Konfigurationsdatei:

Kopieren Sie schliesslich die Standard-Wrapper-Konfigurationsdatei. Wir werden sie in diesem Abschnitt editieren.

Kopieren einer Datei:
%WRAPPER_HOME%\src\conf\wrapper.conf.in -> %EXAMPLE_HOME%\conf\wrapper.conf

Wrapper-Konfigurationsdatei

Öffnen Sie die %EXAMPLE_HOME%\conf\wrapper.conf-Datei im Texteditor Ihrer Wahl. Z.B. mit Notepad.

Lokalisieren und ändern Sie die folgenden Eigenschaften.

Konfigurationsdatei:
wrapper.java.command=java
wrapper.java.command.loglevel=INFO

wrapper.java.mainclass=org.tanukisoftware.wrapper.WrapperSimpleApp
wrapper.app.parameter.1=HelloWorldServer

wrapper.java.classpath.1=../lib/wrapper.jar
wrapper.java.classpath.2=../lib/classes

wrapper.java.library.path.1=../lib

wrapper.logfile=../logs/wrapper.log

wrapper.console.title=Hello World Server
wrapper.name=helloworldserver
wrapper.displayname=Hello World Server
wrapper.description=Hello World Server
  • Die wrapper.java.command Eigenschaft wird benutzt, um den Ort des genutzten Java-Befehls zu bestimmen. Den Wert, den wir ermittelt haben, befindet sich im Systemverzeichnis. Es ist auch möglich, einen absoluten Pfad zu bestimmen.

  • Die wrapper.java.command.loglevel Eigenschaft ist optional, aber sie ist nützlich, um die Java-Befehlszeile zu testen, die der Wrapper erstellt. Wir empfehlen Ihnen, dass Sie das hinzufügen, wenn Sie damit anfangen. Später kann es jedoch auskommentiert werden, sobald Ihre Anwendung läuft.

  • Die wrapper.java.mainclass Eigenschaft wird genutzt, um die Main-Class zu bestimmen, die Java übergeben wird, wenn es gestartet wird. Dies ist ein Punkt, der bei neuen Usern für Verwirrung sorgen kann, aber in den meisten Fällen wird es sich dabei um eine Helper-Klasse von Java statt der Main-Class Ihrer Anwendung handeln. Der Wrapper unterstützt verschiedene Integrationsmethoden, aber für dieses Beispiel nutzen wir die einfachste Methode namens Integrationsmethode #1 (WrapperSimpleApp). Diese Methode benutzt die org.tanukisoftware.wrapper.WrapperSimpleApp- Helper-Klasse, um die gesamte JVM- und Backend-Kommunikation mit dem Wrapper zu steuern.

  • Die eigentliche Main-Class unserer Anwendung HelloWorldServer wird als erster Parameter unter Nutzung der wrapper.app.parameter.1 -Eigenschaft übergeben. Es ist möglich, weitere Parameter dem HelloWorldServer zu übergeben, indem zusätzliche Eigenschaften mit wachsenden Indexzahlen, wie z.B. wrapper.app.parameter.2=P1 übergeben werden.

    Wir werden das hier nicht behandeln, aber es ist auch möglich, zusätzliche Java-Parameter unter Nutzung der wrapper.java.additional.<n>- Eigenschaften hinzuzufügen.

  • Der nächste Schritt ist es, den Klassenpfad zu bestimmen. Dies wird durch Nutzung der wrapper.java.classpath.<n>- Eigenschaften getan. Wir benötigen zwei Klassenpfad-Einträge für unsere Anwendung. Dem Ersten wird die benötigte wrapper.jar-Datei beigefügt, der die Helper-Klassen des Wrappers enthält. Der Zweite beinhaltet das lib/classes-Verzeichnis, wo sich auch unsere HelloWorldServer-Klasse befindet.

  • Der Wrapper benutzt eine native Bibliothek, wrapper.dll, um seine Funktionalität zu implementieren. Native Bibliotheken werden von vielen Java-Anwendungen nicht benutzt. Daher sind diese Ihnen ggf. noch nicht begegnet. Die wrapper.java.library.path.<n>- Eigenschaften werden benutzt, um herauszufinden, wo sich diese Bibliotheken befinden.

Wir haben jetzt den Wrapper mitgeteilt, wie dieser unsere Java-Anwendung starten kann.

Es gibt ein paar zusätzliche Eigenschaften, die eingerichtet werden müssen.

Ein wichtiger Punkt, der bezüglich all dieser Eigenschaftswerte zu beachten ist, ist der, dass diese immer mit Pfadwerten bestimmt werden, die relativ zu dem Standort des wrapper.exe-Verzeichnisses sind.

Zusätzlich zu den Eigenschaften, die wir festlegen, gibt es ein paar andere Schlüsselelemente der Konfigurationsdatei, deren Sie sich bewusst sein sollten.

  • Der Dateianfang enthält eine Dateiverschlüsselung.

  • Die #include ../conf/wrapper-license.conf Zeile benutzt das "include file"-Feature, um die Eigenschaften des Lizenzschlüssels hinzuzufügen. Bitte beachten Sie, dass das vorausgehende # benötigt wird.

  • Die wrapper.lang.folder -Eigenschaft wird benutzt, um den Standort der Wrapper-Lokalisierungsdateien zu bestimmen.

Ausführen von HelloWorldServer in einer Konsole

Der Wrapper wurde nun eingerichtet. Lass uns mit dem Testen unserer Konfiguration in der Windows Eingabeaufforderung beginnen.

Bitte öffnen Sie eine neue Eingabeaufforderung und gehen Sie in unser %EXAMPLE_HOME% -Verzeichnis mit dem Befehl cd command. Der Wrapper und Ihre Anwendung, die vom Wrapper gesteuert wird, kann nun wie folgt gestartet werden:

bin\wrapper.exe -c ..\conf\wrapper.conf

Beachten Sie, dass der Standort der Konfigurationsdatei relativ zum Standort der Wrapper-Programmdatei ist. Dies ist etwas ungewöhnlich, aber es erhöht wesentlich die Zuverlässigkeit des Wrappers, wenn dieser über verschiedene Methoden gestartet wird.

Wenn der Wrapper startet, sollten Sie etwas wie folgt sehen:

wrapper  | --> Wrapper Started as Console
wrapper  | Java Service Wrapper Professional Edition 64-bit {version}
wrapper  |   Copyright (C) 1999-2010 Tanuki Software, Ltd. All Rights Reserved.
wrapper  |     https://wrapper.tanukisoftware.com
wrapper  |
wrapper  | --------------------------------------------------------------------
wrapper  | Vielen Dank für Ihr Interesse am Java Service Wrapper.
wrapper  |
wrapper  | Sie verwenden einen voll funktionsfähigen Testlizenzschlüssel, der
wrapper  | es Ihnen bis erlaubt den Java Serv ice Wrapper jederzeit laufen und
wrapper  | neu starten zu lassen. Jeder Aufruf des Wrappers wird automatisch
wrapper  | nach 15 Minuten beendet.
wrapper  |
wrapper  | Dieser eingeschränkte Testlizenzschlüssel kann für schnelle
wrapper  | Konfigurationstests auf verschiedenen Maschinen verwendet werden
wrapper  | ohne eine weitere Testlizenz beantragen zu müssen. Sollten Sie
wrapper  | mehr Zeit benötigen, können Sie eine 1-monatige kostenlose
wrapper  | Testlizenz beantragen:
wrapper  |   https://wrapper.tanukisoftware.com/trial
wrapper  |
wrapper  | Der Java Service Wrapper benötigt für die Softwareaktivierung einen Lizenzschlüssel.
wrapper  | Lizenzen können über die Java Service Wrapper Website gekauft werden:
wrapper  |   https://wrapper.tanukisoftware.com/purchase
wrapper  |
wrapper  | This trial License Key in intended for testing and development and
wrapper  | should not be used as part of a production environment.
wrapper  | --------------------------------------------------------------------
wrapper  |
wrapper  |
wrapper  | Starten einer JVM ...
wrapper  | Command: "C:\Sun\jdk1.6.0_10_x64\bin\java.exe" -Djava.library.path="../lib" \
                     -classpath "../lib/wrapper.jar;../lib/classes" -Dwrapper.key="BBXKL6wk_SGpOV-i1z3E6yTeW1NQr62T" \
                     -Dwrapper.port=32000 -Dwrapper.jvm.port.min=31000 -Dwrapper.jvm.port.max=31999 -Dwrapper.pid=464 \
                     -Dwrapper.version="x.y.z" -Dwrapper.native_library="wrapper" -Dwrapper.cpu.timeout="10" \
                     -Dwrapper.jvmid=1 org.tanukisoftware.wrapper.WrapperSimpleApp HelloWorldServer
jvm 1    | WrapperManager: Initialisierung ...
jvm 1    | Accepting connections on port: 9000

Der Banner am Anfang der Logdatei ist, weil wir eine vorübergehende Testlizenz benutzen. Er weist Sie daraufhin, wo Sie eine langfristige Testlizenz erhalten oder wo Sie später eine Lizenz kaufen können.

Die Zeile, die mit "Command: " startet ist eine Debug-Nachricht. Sie zeigt die genaue Java-Befehlszeile, die der Wrapper ausführt, um die JVM zu starten. Sie ist sehr nützlich, um Probleme zu lösen. Sobald Ihre Anwendung funktioniert, kommentieren Sie bitte die wrapper.java.command.loglevel- Eigenschaft aus. Der Rest dieses Beispiels geht davon aus, dass Sie dies so getan haben.

Wenn Sie eine Lizenz gekauft haben, wird Ihnen etwas, wie folgt, angezeigt:

wrapper  | --> Wrapper Started as Console
wrapper  | Java Service Wrapper Professional Edition 64-bit {version}
wrapper  |   Copyright (C) 1999-2010 Tanuki Software, Ltd. All Rights Reserved.
wrapper  |     https://wrapper.tanukisoftware.com
wrapper  |   Licensed to {licensee}
wrapper  |
wrapper  | Starten einer JVM ...
jvm 1    | WrapperManager: Initialisierung ...
jvm 1    | Accepting connections on port: 9000

Sie können Ihre Anwendung jederzeit durch Drücken von STRG-C beenden. Der Wrapper speichert stets einen Eintrag darüber, warum eine Anwendung beendet wurde; so dass Sie etwas wie folgt in Ihrer Logdatei sehen werden.

wrapper  | CTRL-C erfasst. Herunterfahren.
wrapper  | <-- Wrapper beendet

Einen Absturz simulieren

Jetzt können Sie an einem sehr einfachen Beispiel sehen, wie der Wrapper in der Lage ist, sich von ein paar Ausfällen zu erholen. Starten Sie bitte den Wrapper nochmals. Als Nächstes öffnen Sie den Windows Task Manager. Dies können Sie mit STRL-ALT-ENTF tun.

Sehen Sie auf die Registerkarte Prozesse und machen Sie den java.exe-Prozess ausfindig. Wählen Sie ihn aus und drücken Sie auf Prozess beenden. Dies teilt Windows mit, den Java-Prozess sofort zu beenden, ohne diesem die Möglichkeit zu geben, sich normal zu beenden.

Wenn der Java-Prozess verschwindet, können Sie etwas wie folgt im Wrapper-Log sehen. Beachten Sie, wie der Wrapper erkennt, dass die JVM nicht mehr existiert und innerhalb weniger Sekunden einen Ersatzprozess startet.

wrapper  | JVM beendete sich unerwartet.
wrapper  | Starten einer JVM ...
jvm 2    | WrapperManager: Initialisierung ...
jvm 2    | Accepting connections on port: 9000

Die Logdatei zeichnet auf, wie viele Male die JVM neu gestartet wurde. Dies ist sehr nützlich für Systemadministratoren, damit diese einfach durch Betrachten der Dateiendung erkennen können, ob Probleme aufgetreten sind.

HelloWorldServer als einen Dienst ausführen

Sobald die Wrapper-Konfiguration als korrekt überprüft wurde, sind wir imstande, den Wrapper als einen Dienst zu installieren.

Den Dienst installieren

Dies kann durch die Nutzung des -i Befehls für den Wrapper, wie folgt, getan werden.

NOTE

Bitte beachten Sie, dass Sie ein Systemadministrator sein müssen, um dies tun zu können. Ab der Windows 7 und Windows 2008 müssen Sie auch die Ausführung via der Konsole mit privilegierte Rechten durchführen.

bin\wrapper.exe -i ..\conf\wrapper.conf

Sie sollten etwas wie folgt sehen, was bestätigt, dass der Dienst installiert wurde.

wrapper  | Hello World Server service installed.

Starten des Dienstes

Sie können nun den Dienst wie jeden anderen Windows Dienst starten. Dies kann über das Dienste-Programm der Windows Systemsteuerung erledigt werden [Systemsteuerung] - [Administrator Tools] - [Dienste].

Der Windows net start-Befehl kann auch benutzt werden:

net start helloworld

Es ist auch möglich, den Wrapper mit folgendem Wrapper-Programmbefehl zu starten:

bin\wrapper.exe -t ..\conf\wrapper.conf

In diesem Fall werden Sie Folgendes sehen:

wrapper  | Starting the Hello World Server service...
wrapper  | Hello World Server started.

Sie können nun bestätigen, dass der Dienst läuft, indem Sie in das Systemsteuerungs-Dienste-Programm [Systemsteuerung] - [Administrator Tools] - [Dienste], den Task-Manager, und die WRAPPER_HOME\logs\wrapper.log-Datei sehen.

Den Dienst beenden

Wenn Sie bereit sind, den Dienst zu beenden, können Sie es so wie oben beschrieben tun, oder indem Sie den Wrapper benutzen:

bin\wrapper.exe -p ..\conf\wrapper.conf

Den Dienst deinstallieren

Der Wrapper ist gegenwärtig so konfiguriert, bei Systemneustart auch neu zu starten. Da dies ein Test ist, möchten Sie wahrscheinlich den Dienst wie folgt entfernen:

bin\wrapper.exe -r ..\conf\wrapper.conf

Verweis: Starten Ihrer Anwendung mit dem Wrapper