World Map
Java Service Wrapper ist der einfachste Weg, um Ihr Produkt zuverlässiger, sicherer zu machen.
  • Free Trial
  • Buy Now
WrapperSimpleApp Integration (Windows)

Methode 1 - WrapperSimpleApp Integration (Windows)

Übersicht

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

Es gibt jedoch ein paar Dinge, auf die man achten muss, wenn man diese Methode benutzt. Wenn der Wrapper die JVM herunterfährt, gibt es keinen direkten Aufruf einer Anwendung, die ein sauberes Herunterfahren erfordert. 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, ordnungsgemäß herunterzufahren. Wenn andererseits, kein Shutdown Hook registriert ist, dann wird die Anwendung plötzlich beendet gleich dem Drücken von CTRL-C in der Konsole (Kommandofenster). Beide Fälle, mit und ohne ein Shutdown-Hook, liefern das genau gleiche Verhalten, so als ob die Anwendung ohne den Wrapper laufen würde.

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

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

Detaillierte Anweisungen

Dieser Abschnitt erlaubt Ihnen, eine detaillierte Beschreibung durchzugehen, 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.

Installation 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 imstande zu sein, den Wrapper zu nutzen.

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 wiedergeben. Stellen Sie bitte sicher, dass die .in Endungen entfernt und alle Dateien in .bat enden.

(Abhängig davon, wie Ihr Datei-Explorer auf Ihrem Computer konfiguriert wurde, kann es sein, dass Sie nicht die Dateiendungen 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 und zu 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, dann müssen diese drei Batch-Dateien passend geändert werden.

lib-Verzeichnis

Kopieren Sie die Native Library und die Wrapper-Jar-Datei ins HelloWorld lib-Verzeichnis:

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

NOTE

Die wrapper.dll Datei ist eine Native-Library, 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 in dem Homeverzeichnis der Anwendung. Bitte kopieren Sie die folgende Vorlagendatei wrapper.conf.in in das conf-Verzeichnis von HelloWorld.

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

Benennen Sie die Datei. Stellen Sie dabei sicher die Endung .in zu entfernen, so dass die Datei wrapper.conf lautet.

Sie sollten nun Folgendes haben:

{MYAPP_HOME}\conf\wrapper.conf

Wenn Sie wünschen, die Konfigurationsdatei wrapper.conf in ein anderes Verzeichnis zu verschieben, können Sie es so tun. Sie müssen die Batch-Dateien, die in das oben genannte bin-Verzeichnis kopiert wurden, ändern, damit der neue Ort richtig widergegeben wird.

logs-Verzeichnis

Die Standard-Konfigurationsdatei wrapper.conf legt eine wrapper.log Datei in ein logs-Verzeichnis unterhalb des Homeverzeichnisses der Anwendung ab.

Stellen Sie sicher, dass Sie folgendes Verzeichnis erstellt haben:

{MYAPP_HOME}\logs

Wenn Sie wünschen, die wrapper.log Datei in einem anderen Verzeichnis abzulegen, müssen Sie die wrapper.conf Datei editieren und die Wrapper-Logdatei wrapper.logfile Eigenschaften anpassen, um den neuen Ort passend widerzugeben.

lang-Verzeichnis

Von der Wrapper Version 3.5.0, kann der Wrapper örtlich festgelegt werden. Die Sprachen-Ressourcedateien können im lang-Verzeichnis gefunden werden. Falls notwendig, erstellen Sie bitte so ein lang Verzeichnis unterhalb des Home-Verzeichnisses der Anwendung und kopieren Sie diese Dateien dorthin:

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

Wenn Sie wünschen die *.mo Dateien an einem anderen Ort abzulegen, müssen Sie die wrapper.conf-Datei editieren und die Eigenschaften des wrapper.lang.folder abändern, um den neuen Ort richtig wiederzugeben.

Gehen Sie in die 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.

Die meisten Anwendungen benutzen ein Skript, um die Befehlszeile zu erstellen. Diese Skripts tendieren dazu, ziemlich unhandlich zu werden. In der Tat ist die Feature-Fähigkeit des Wrappers, die Nutzung von Skripts vermeiden zu können, einer der Vorzüge in der Arbeit mit dem Wrapper.

Die Mehrheit des Skripts hat die Aufgabe systemspezifische Informationen zu sammeln und diese Information in den Umgebungsvariablen zu speichern. Die oben genannten Zeilen weiten alle gesammelten Informationen in den finalen Java-Befehl aus, der die Anwendung startet.

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

Im Fall unserer einfachen HelloWorld-Anwendung wird ein Skript nicht benötigt. Der zu ausfü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 führen Sie die unten genannten Änderungen durch.

NOTE

Wo die Eigenschaften unten erwähnt sind, werden Links zu den Beschreibungen genannt. Nehmen Sie sich bitte die Zeit, die Beschreibungen von allen Eigenschaften, die verändert wurden, zu überprüfen. In vielen Fällen gibt es weitere Beschreibungen bezüglich ihrem Einsatz, die hier nicht aufgeführt werden.

Umgebungsvariable:

Für eine einfache Konfiguration wird empfohlen das HOME-Verzeichnis von HelloWorld und Java in die Umgebungsvariablen der Konfigurationsdatei zu speichern. Dies ermöglicht, die conf-Datei einfacher zu lesen und zu warten im Fall, dass ein Verzeichnis geändert wurde. 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 wrapper.java.command Eigenschaft zugewiesen:

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

Java-Argumente

Die meisten Anwendungen liefern eine Zahl von Parametern an die Java-Programmdatei, sobald sie gestartet wird. Der Wrapper liefert besondere Eigenschaften für die Konfiguration von Dingen wie Speicher oder auch Class- und Verzeichnis-Pfade. 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 unter Einsatz der wrapper.java.initmemory und wrapper.java.maxmemory Eigenschaften 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 direkt von der Befehlszeile ohne Änderungen kopiert wurden. Bitte sehen Sie mit Bezug darauf, wie mit Eigenschaften umgegangen werden kann, die Leerzeichen enthalten in der Dokumentation der Eigenschaften nach.

Classpath

Als Nächstes kommt der Classpath, der unter Einsatz der wrapper.java.classpath.<n> Eigenschaften konfiguriert wurde. Der Wrapper erfordert, dass der Classpath in seine individuellen Teile aufgeteilt wird. Dann, auch weil wir den Wrapper benutzen, ist es notwendig, auch die wrapper.jar Datei mit einzuschließen:

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

Main Class

Um eine Kommunikation zwischen HelloWorld und den Wrapper zu erstellen, ist der Einsatz der Helper-Class WrapperSimpleApp als Main-Class notwendig. Die Main-Class, die von Java beim Start ausgeführt wird, wird definiert unter Nutzung der wrapper.java.mainclass Eigenschaft. Die HelloWorld Main-Class wird dann als der erste Anwendungsparamter bestimmt (Sehen Sie bitte den 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-Class. Wie oben erwähnt, ist es notwendig als ersten Parameter die HelloWorld Main-Class festzulegen. Andere Parameter kommen danach.

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

Library-Verzeichnis

Um den Wrapper einzusetzen, gibt es eine weitere Eigenschaft, die gesetzt werden muss. Der Wrapper benutzt eine Native-Library um den Austausch mit dem System zu steuern. Diese library-Datei wrapper.dll muss im Library-Pfad, der gegenüber der JVM angegeben wird, bestimmt werden.

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

Zusammenfassung

Als Zusammenfassung bekommen 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

# Java Classpath (include wrapper.jar)
wrapper.java.classpath.1=%MYAPP_HOME%\lib\wrapper.jar
wrapper.java.classpath.2=%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

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

Der abschließende Schritt ist das Setzen der Windows-Dienst-Eigenschaften. Wir setzen die Eigenschaften, die geändert werden sollten. Aber es gibt ein paar weitere verfügbar. Bitte sehen Sie in der Dokumentation für Details bezüglich der Nutzung. 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, diese Batch-Datei innerhalb des bin Verzeichnis auszuführen. Bitte versuchen Sie die Anwendung einmal als Konsolenanwendung zu starten, um die Konfiguration zu überprüfen, bevor Sie versuchen, es als Dienst auszuführen.

Glückwünsch. Ihre Anwendung sollte jetzt laufen.

Wenn Sie irgendwelche Probleme haben würden, sehen Sie bitte im Abschnitt Troubleshooting nach, um Hilfe für das Aufspüren des Problems zu erhalten.

Erweiterte Informationen

Tuning des Hochstartens

Standardmässig wartet die WrapperSimpleApp Klasse 2 Sekunden auf die Main-Methode der User-Anwendung für die Fertigstellung. 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 keinen Wert während der Ausführung der Anwendung zurückgeben. In solchen Fällen gibt es keinen sicheren Weg für die WrapperSimpleApp-Klasse mitzuteilen, wann und ob die Anwendung das Hochstarten fertiggestellt hat.

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

waitForStartMain System Eigenschaft:

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

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

maxStartMainWait System Eigenschaft:

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

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

Der Standardwert ist "2 Sekunden".

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

NOTE

Die Hauptmethoden von vielen Anwendungen sind ausgelegt, keinen Ergebniswert zu geben. In diesen Fällen müssen Sie sich entweder an die üblichen 2-Sekunden-Timeoutzeit beim Hochstarten halten oder ein etwas längeres Timeout bestimmen. Dies ist unter Nutzung der maxStartMainWait-Eigenschaft möglich, um die Zeitspanne zu simulieren, die Ihre Anwendung braucht, um hochzustarten.

WARNING

Wenn der Wert TRUE in der waitForStartMain für eine Anwendung festgelegt ist dessen start Methode niemals einen Wert zurückgibt, erscheint der Wrapper zu Anfangs korrekt zu funktionieren. Jedoch befindet sich der Wrapper in Wirklichkeit in einem ewig andauernden Wartestatus und wird nie in einen StartModus kommen. Das bedeutet, dass der Windows Service Manager und weitere der Wrapper-Fehlermechanismen nicht korrekt funktionieren werden.