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:
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.)
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:
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:
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:
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:
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.
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:
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.
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).
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.
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 Bibliotheksdateiwrapper.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
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.
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:
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.