Methode 1 - WrapperSimpleApp-Integration (Windows)

Overview

Methode 1 wird eingesetzt, um die WrapperSimpleApp Helper-Klasse für den Anwendungsstart zu benutzen. Dies ist bei weitem der einfachste Weg, um den Wrapper zu integrieren, und wo möglich, wird dieser auch sehr empfohlen.

Es gibt jedoch ein paar Dinge, auf die beim Benutzen dieser Methode geachtet werden sollte. Wenn der Wrapper die JVM beendet, gibt es keinen direkten Aufruf in der Anwendung, die ein ordnungsgemäßes Beenden ermöglicht. Viel mehr beendet der Wrapper die JVM durch das Aufrufen von System.exit() innerhalb der JVM. Falls die Anwendung ihren eigenen "Shutdown Hook" registriert hat, wird dieser aufgerufen werden, und gibt so der Anwendung eine Möglichkeit, sich ordnungsgemäß zu beenden. Wenn andererseits kein Shutdown Hook registriert ist, wird die Anwendung plötzlich beendet, gleich dem Drücken von CTRL-C in der Konsole (Kommandofenster). Beide Fälle, mit und ohne Shutdown Hook, liefern das genau gleiche Verhalten, als ob die Anwendung ohne den Wrapper laufen würde.

Durch dieses Einbinden der Methode 1 ersetzt die WrapperSimpleApp Helper-Klasse die Main-Klasse einer Anwendung. Dies gibt der WrapperSimpleApp-Klasse eine Chance sofort den WrapperManager zu initialisieren und die JVM mit dem Wrapper zu registrieren. Die WrapperSimpleApp-Klasse regelt dann den gesamten Austausch mit dem Wrapper sowie den Lebenszyklus einer Anwendung. Wenn der Wrapper eine Start-Nachricht an die JVM via den WrapperManager sendet, wird die Hauptmethode der aktuellen Main-Klasse der Anwendung aufgerufen.

Die WrapperSimpleApp-Helper-Klasse wird darüber informiert, wie die Anwendung durch Übergabe des Main-Klasse-Namens, gefolgt durch beliebige zusätzliche Anwendungsparameter an die Main-Methode der WrapperSimpleApp zu starten ist.

Detaillierte Anweisungen

Dieser Abschnitt enthält eine detaillierte Beschreibung davon, wie eine einfache HelloWorld-Anwendung zu konfigurieren ist, um diese innerhalb des Wrappers auszuführen. Die meisten anderen Anwendungen können durch das Ausführen der gleichen Schritte eingebunden werden.

HelloWorld-Anwendung

Dieses Tutorial startet mit einer einfachen Anwendung HelloWorld, die einfach nur "Hello world" ausgibt. Der Pfad zu dieser Anwendung ist d:\helloworld - und hat den Referenznamen {MYAPP_HOME}. Ein paar zusätzliche Ordner (bin, lib, conf und logs), in denen Dateien des Wrappers kopiert werden, müssen existieren.

Installation der Wrapper-Dateien

Es gibt vier Verzeichnisse, die eine Konfiguration erfordern, um den Wrapper nutzen zu können.

bin-Verzeichnis

Kopieren Sie bitte zuerst die folgenden Dateien in das HelloWorld-Verzeichnis bin:

{WRAPPER_HOME}\bin\wrapper.exe
{WRAPPER_HOME}\src\bin\App.bat.in
{WRAPPER_HOME}\src\bin\InstallApp-NT.bat.in
{WRAPPER_HOME}\src\bin\UninstallApp-NT.bat.in

Benennen Sie die 3 Batch-Dateien um, so dass sie Ihren Anwendungsnamen wie folgt wiedergeben. Stellen Sie bitte sicher, dass die .in Endungen entfernt werden und alle Dateien in .bat enden.

(Abhängig davon, wie der Datei-Explorer auf Ihrem Computer konfiguriert wurde, kann es sein, dass Sie die Dateiendungen nicht sehen.)

Sie sollten nun Folgendes haben:

{MYAPP_HOME}\bin\helloworld.bat
{MYAPP_HOME}\bin\Install-helloworld.bat
{MYAPP_HOME}\bin\Uninstall-helloworld.bat

Die wrapper.exe-Datei ist die eigentliche, ausführbare Datei des Wrappers. Die drei Batch-Dateien werden benutzt, um HelloWorld in einer Konsole auszuführen, und um es als Windows Dienst zu installieren/deinstallieren.

Diese Batch-Dateien sollten keine Änderung erfordern. Sie gehen davon aus, dass sich die wrapper.conf-Datei innerhalb eines conf-Verzeichnisses, um eine Ebene erhöht befindet, ../conf/wrapper.conf. Wenn Sie die wrapper.conf-Datei woanders speichern möchten, müssen diese drei Batch-Dateien entsprechend geändert werden.

lib-Verzeichnis

Kopieren Sie die native Bibliothek und die Wrapper-Jar-Datei ins HelloWorld lib-Verzeichnis:

{WRAPPER_HOME}\lib\wrapper.dll
{WRAPPER_HOME}\lib\wrapper.jar

Die wrapper.dll-Datei ist eine native Bibliothek Datei, die von dem Teil des Wrappers benötigt wird, der innerhalb der JVM läuft. Die wrapper.jar-Datei beinhaltet alle Wrapper-Klassen.

conf-Verzeichnis

Sämtliche Konfigurationseinstellungen des Wrappers erfolgen über die Datei wrapper.conf. Der Standard-Ablageort für diese Datei befindet sich in einem conf-Verzeichnis im Home-Verzeichnis der Anwendung. Bitte kopieren Sie die folgende Vorlagendatei wrapper.conf.in in das conf-Verzeichnis von HelloWorld.

{WRAPPER_HOME}\src\conf\wrapper.conf.in

Stellen Sie sicher, dass Sie die Endung .in entfernen, so dass die Datei wrapper.conf heißt.

Sie sollten nun Folgendes haben:

{MYAPP_HOME}\conf\wrapper.conf

Wenn Sie die Konfigurationsdatei wrapper.conf in ein anderes Verzeichnis verschieben möchten, können Sie dies tun. Sie müssen die Batch-Dateien, die in das oben genannte bin-Verzeichnis kopiert wurden, ändern, damit der neue Speicherort richtig wiedergegeben wird.

logs-Verzeichnis

Die Standard-Konfigurationsdatei wrapper.conf wird eine wrapper.log-Datei in einem logs-Verzeichnis unterhalb des Home-Verzeichnisses der Anwendung ablegen.

Stellen Sie sicher, dass Sie folgendes Verzeichnis erstellt haben:

{MYAPP_HOME}\logs

Wenn Sie die wrapper.log-Datei an einem anderen Ort ablegen möchten, müssen Sie die wrapper.conf-Datei editieren und die Eigenschaft wrapper.logfile abändern, um den neuen Ort richtig widerzuspiegeln.

lang-Verzeichnis

Ab der Wrapper-Version 3.5.0, kann der Wrapper lokalisiert werden. Die Dateien für die Sprachenressourcen befinden sich im lang-Verzeichnis. Erstellen Sie bei Bedarf ein lang-Verzeichnis im Home-Verzeichnis der Anwendung und kopieren Sie diese Dateien dorthin:

{MYAPP_HOME}\lang\wrapper_XX.mo
{MYAPP_HOME}\lang\wrapperjni_XX.mo

Wenn Sie die Sprachenressourcen-Dateien *.mo an einem anderen Ort ablegen möchten, müssen Sie die wrapper.conf-Datei editieren und die Eigenschaft wrapper.lang.folder abändern, um den neuen Ort widerzuspiegeln.

Festlegen der Java-Befehlszeile der Anwendung

Bevor der Wrapper konfiguriert werden kann, eine Anwendung zu starten, müssen Sie den kompletten Java-Befehl kennen, der normalerweise benutzt wird, um die Anwendung zu starten.

Die meisten Anwendungen verwenden Skripte, um die tatsächliche Befehlszeile zu erstellen. Diese Skripte neigen dazu, recht unhandlich zu werden, daher ist die Möglichkeit, nicht mit ihnen zu arbeiten, einer der Vorteile der Verwendung des Wrappers.

Die Mehrheit des Skripts hat die Aufgabe systemspezifische Informationen zu sammeln, diese Informationen in den Umgebungsvariablen zu speichern und abschließend den Java-Befehl auszuführen.

Um den Wrapper zu konfigurieren, ist alles, was wirklich benötigt wird, die letzte Java-Befehlszeile.

Im Fall unserer einfachen HelloWorld-Anwendung wird kein Skript benötigt. Der auszuführende Befehl würde wie folgt aussehen:

java com.tanukisoftware.HelloWorld

Ein komplexerer Befehl, um eine Java-Anwendung zu starten, würde wie folgt aussehen:

java -classpath "d:\helloworld\lib\myjar.jar" -Xms128M -Xmx512M com.tanukisoftware.HelloWorld arg1 arg2

Ändern der wrapper.conf-Datei

Um die obengenannte Java-Befehlszeile mit dem Wrapper nutzen zu können, müssen wir die Komponenten der Befehlszeile in eine Konfigurationsdatei aufteilen. Öffnen Sie hierfür die wrapper.conf-Datei in einem Editor und nehmen Sie die untenstehenden Änderungen vor.

NOTE

Wo unten Eigenschaften genannt werden, werden Links zu ihren Beschreibungen bereitgestellt. Nehmen Sie sich bitte die Zeit, die Beschreibungen von jeglichen Eigenschaften anzuschauen, die verändert wurden. In vielen Fällen gibt es weitere Beschreibungen bezüglich ihres Einsatzes, die hier nicht aufgeführt werden.

Umgebungsvariable:

Für eine einfachere Konfiguration wird empfohlen das HOME-verzeichnis von HelloWorld und Java in die Umgebungsvariablen der Konfigurationsdatei zu speichern. Dies macht die conf-Datei wesentlich einfacher zu lesen und zu warten, im Fall, dass ein Verzeichnispfad geändert wird. Der Wrapper setzt diese Umgebungsvariablen jedes Mal, wenn er gestartet wird:

set.MYAPP_HOME=d:\helloworld
set.JAVA_HOME=C:\Program Files\Java\jdk1.8.0_45

Java-Programmdatei

Zuerst wird die Java-Programmdatei extrahiert und der Verzeichnispfad der Eigenschaft wrapper.java.command zugewiesen:

wrapper.java.command=%JAVA_HOME%\bin\java

Java-Argumente

Die meisten Anwendungen liefern der Java-Programmdatei eine Reihe von Parametern, wenn diese gestartet wird. Der Wrapper liefert besondere Konfigurationseigenschaften für Dinge wie Speicher sowie Klassen- und Bibliothekspfade. Diese werden weiter unten behandelt. Jedoch werden alle anderen Einstellungen durch den Einsatz der wrapper.java.additional.<n>-Folge an Eigenschaften konfiguriert.

Die HelloWorld-Anwendung übernimmt 2 zusätzliche Java-Argumente.

wrapper.java.additional.1=-Xms128M
wrapper.java.additional.2=-Xmx512M

Die ursprüngliche und maximale Speichergröße der JVM, die durch -Xms128m (ursprünglich) und -Xmx512m (maximal) bestimmt wird, kann auch unter Einsatz der Eigenschaften wrapper.java.initmemory und wrapper.java.maxmemory definiert werden.

# Initial Java Heap Size (in MB)
wrapper.java.initmemory=128

# Maximum Java Heap Size (in MB)
wrapper.java.maxmemory=512

Beachten Sie, dass die vollständigen Eigenschaften ohne Änderungen direkt aus der Befehlszeile kopiert wurden. Informationen zum Umgang mit Eigenschaften, die Leerzeichen enthalten, finden Sie in der Dokumentation der Eigenschaften.

wrapper.jar

Der Wrapper erstellt die Anforderung, dass die wrapper.jar spezifiziert wird:

wrapper.jarfile=%MYAPP_HOME%\lib\wrapper.jar

WARNING

The wrapper.jarfile property was introduced in version 3.5.55. When using earlier Wrapper versions, it is necessary to include wrapper.jar in the classpath:

wrapper.java.classpath.1=D:\apache-tomcat-9.0.0.M13\lib\wrapper.jar

Then, the indices of next classpath elements must be adjusted so that the wrapper.java.classpath.1 property is not repeated.

Classpath

Als Nächstes kommt der Classpath, der unter Einsatz der wrapper.java.classpath.<n>-Eigenschaften konfiguriert wird. Der Wrapper erfordert, dass der Classpath in seine individuellen Teile aufgeteilt wird.

wrapper.java.classpath.1=%MYAPP_HOME%\lib\myjar.jar

Main-Klasse

Um eine Kommunikation zwischen HelloWorld und dem Wrapper zu erstellen, ist der Einsatz der Helper-Klasse WrapperSimpleApp als Main-Klasse notwendig. Die Main-Klasse, die von Java beim Start ausgeführt wird, wird durch die wrapper.java.mainclass-Eigenschaft festgelegt. Die HelloWorld-Main-Klasse wird dann als der erste Anwendungsparamter festgelegt (siehe Abschnitt unten).

wrapper.java.mainclass=org.tanukisoftware.wrapper.WrapperSimpleApp

Anwendungsparameter

Anwendungsparameter werden unter Benutzung der wrapper.app.parameter.<n>-Eigenschaften gesetzt. Anwendungsparameter erscheinen in der Java-Befehlszeile direkt hinter der Main-Klasse. Wie oben erwähnt, ist es notwendig als ersten Parameter die HelloWorld Main-Klasse festzulegen. Andere Parameter kommen danach.

wrapper.app.parameter.1=com.tanukisoftware.HelloWorld
wrapper.app.parameter.2=arg1
wrapper.app.parameter.3=arg2

Bibliothekspfad

Um den Wrapper einzusetzen, muss eine weitere Eigenschaft gesetzt werden. Der Wrapper benutzt eine native Bibliothek, um den Austausch mit dem System zu steuern. Diese Bibliotheksdatei wrapper.dll muss im Bibliothekspfad bestimmt werden, der gegenüber der JVM angegeben wird.

wrapper.java.library.path.1=%MYAPP_HOME%\lib

Zusammenfassung

Zusammenfassend erhalten wir Folgendes:

set.MYAPP_HOME=d:\helloworld
set.JAVA_HOME=C:\Program Files\Java\jdk1.8.0_45

wrapper.java.command=%JAVA_HOME%\bin\java

# Java Main class.
wrapper.java.mainclass=org.tanukisoftware.wrapper.WrapperSimpleApp

# Wrapper Jar
wrapper.jarfile=%MYAPP_HOME%\lib\wrapper.jar

# Java Classpath
wrapper.java.classpath.1=%MYAPP_HOME%\lib\myjar.jar

# Java Library Path (location of Wrapper.DLL or libwrapper.so)
wrapper.java.library.path.1=%MYAPP_HOME%\lib

# Java Bits.  On applicable platforms, tells the JVM to run in 32 or 64-bit mode.
wrapper.java.additional.auto_bits=TRUE

# Java Additional Parameters
# JVM settings
wrapper.java.additional.1=-Xms128M
wrapper.java.additional.2=-Xmx512M

# Initial Java Heap Size (in MB)
#wrapper.java.initmemory=128

# Maximum Java Heap Size (in MB)
#wrapper.java.maxmemory=512

# Application parameters. Add parameters as needed starting from 1
wrapper.app.parameter.1=com.tanukisoftware.HelloWorld
wrapper.app.parameter.2=arg1
wrapper.app.parameter.3=arg2

Windows-Dienst-Eigenschaften

(Siehe: Windows-Versionen, die vom Wrapper unterstützt werden)

Der abschließende Schritt ist das Setzen der Windows-Dienst-Eigenschaften. Wir setzen nur die Eigenschaften, die geändert werden sollten, es sind jedoch weitere verfügbar. Weitere Informationen zu deren Nutzung finden Sie in der Dokumentation für Details. Vorgeschlagene Werte für diese Variablen werden unten angezeigt.

wrapper.ntservice.name=HelloWorld
wrapper.ntservice.displayname=Hello World
wrapper.ntservice.description=Hello World

Testen

HelloWorld kann nun durch einfaches Ausführen der Batch-Datei bin\helloworld.bat gestartet werden. Aufgrund der Art, wie der Wrapper sein aktuelles Verzeichnis festlegt, ist es nicht notwendig, die Batch-Datei innerhalb des bin-Verzeichnisses auszuführen. Bitte versuchen Sie die Anwendung einmal als Konsolenanwendung zu starten, um die Konfiguration zu überprüfen, bevor Sie versuchen, sie als Dienst auszuführen.

Herzlichen Glückwunsch! Ihre Anwendung sollte jetzt laufen.

Wenn Sie Probleme hatten, finden Sie im Abschnitt Troubleshooting Hilfe, zur Lösung des Problems.

Erweiterte Informationen

Tuning des Hochstartens

Standardmäßig wartet die WrapperSimpleApp Klasse 2 Sekunden auf die Fertigstellung der Main-Methode der User-Anwendung. Danach nimmt sie an, dass die Anwendung gestartet wurde und erstattet einen Bericht an den Wrapper-Prozess. Dies wird gemacht, weil viele User-Anwendungen mit Main-Methoden geschrieben sind, die während der Ausführung der Anwendung keinen Wert zurückgeben. In solchen Fällen gibt es keinen zuverlässigen Weg für die WrapperSimpleApp-Klasse mitzuteilen, wann und ob die Anwendung das Hochstarten fertiggestellt hat.

Wenn jedoch bekannt ist, dass die Main-Methode der Anwendung einen Wert zurückgibt, sobald die Anwendung gestartet wurde, wäre es für den Wrapper am besten, zu warten bis dies abgeschlossen ist, bevor es die Ausführung fortsetzt.

waitForStartMain Systemeigenschaft:

Für Main-Methoden, die auf diese Art Werte zurückgeben, sucht die WrapperSimpleApp nach der org.tanukisoftware.wrapper.WrapperSimpleApp.waitForStartMain Systemeigenschaft. Wenn es auf TRUE eingestellt ist, wird die WrapperSimpleApp unbegrenzt auf die Fertigstellung der Main-Methode warten.

Beispiel: (Wartezeit aktivieren)
wrapper.java.additional.10=-Dorg.tanukisoftware.wrapper.WrapperSimpleApp.waitForStartMain=TRUE

maxStartMainWait Systemeigenschaft:

Unendlich zu warten ist eine vorteilhafte Option, wenn gewiss ist, dass die Main-Methode zeitnah antworten wird. Andererseits wird der Wrapper während er unbegrenzt wartet, während des Hochfahrens niemals aufgeben, unabhängig davon, wie lange es dauert.

Wenn die Möglichkeit besteht, dass der Hochstarten-Vorgang hängen könnte, ist es besser, die org.tanukisoftware.wrapper.WrapperSimpleApp.maxStartMainWait Systemeigenschaft auf die maximale Wartezeit einzustellen. Zum Beispiel um bis zu 5 Minuten (300 Sekunden) auf die Fertigstellung der Main-Methode beim Hochstarten zu warten, stellen Sie die Eigenschaft wie folgt auf 300 ein:

Der Standardwert ist "2 Sekunden".

Beispiele: (300 Sekunden)
wrapper.java.additional.10=-Dorg.tanukisoftware.wrapper.WrapperSimpleApp.maxStartMainWait=300

NOTE

Die Main-Methoden vieler Anwendungen sind darauf ausgelegt, keinen Wert zurückzugeben. In diesen Fällen müssen Sie sich entweder an die üblichen 2-Sekunden-Timeoutzeit beim Hochstarten halten oder ein etwas längeres Timeout festlegen. Dies ist unter Nutzung der maxStartMainWait-Eigenschaft möglich, um die Zeitspanne zu simulieren, die Ihre Anwendung braucht, um hochzustarten.

WARNING

Wenn TRUE in der waitForStartMain für eine Anwendung festgelegt ist, deren start-Methode niemals einen Wert zurückgibt, erscheint der Wrapper zu Anfang korrekt zu funktionieren. Der Wrapper befindet sich dann jedoch in einem ewig andauernden Wartestatus und wird nie in einen Start-Modus kommen. Das bedeutet, dass der Windows Service Manager und weitere der Wrapper-Fehlermechanismen nicht korrekt funktionieren werden.