World Map
Java Service Wrapper ist der einfachste Weg, um Ihr Produkt verlässlicher zu machen.
  • Free Trial
  • Buy Now
Allgemeine FAQ

Allgemeine FAQ

Zusätzlich sind andere Abschnitte verfügbar, die auch genutzt werden können:

Fragen

Antworten

Meine Anwendung kann nicht auf Netzwerklaufwerke zugreifen, wenn es als Windows-Dienst läuft.

Standardmäßig werden die Windows-Dienste als SYSTEM-User ausgeführt. Das Problem ist, dass der SYSTEM-User keinen Zugang zu den Netzwerkressourcen hat. Wenn Ihre Anwendung als Windows-Dienst gut läuft, dann ist das Erste, was wir versuchen können, ihren Dienst mit dem User auszuführen, mit dem Sie angemeldet waren, als Sie diese als eine Konsolenanwendung ausgeführt haben.

Um dies zu tun,

Der Dienst wird jetzt in der gleichen Umgebung wie der einer Konsolenanwendung laufen, so dass jetzt alles korrekt funktionieren sollte.

INFO

Dieses Problem wird etwas mehr im folgenden Dokument "Microsoft Support: Accessing Network Drives Created in Services Under Windows NT" erörtert.

Abhängig von Ihren Sicherheitsanforderungen kann es sein, dass Sie einen neuen User für diesen Dienst erstellen und konfigurieren möchten.

Ich habe festgestellt, dass auf ein paar Systemen Laufwerke, denen ein Festplattenbuchstabe zugeordnet wurde (Buchstabe zeigt eine Festplatte an), nicht stets nach einem System-Neustart bis sich ein wirklicher Nutzer schliesslich einloggt und mit dem Laufwerk verbindet verfügbar sind. Der Workaround ist der, die UNC Syntax (der gesamte Pfad inklusive des Maschinennamens) zu benutzen, um direkt auf das Laufwerk zu verweisen anstatt den zugeordneten Laufwerksnamen zu benutzen.

Beispiel: UNC-Syntax (der gesamte Pfad inklusive des Maschinennamens)
//host/share/path

Meine Anwendung ist eine ausführbare jar-Datei. Was muss ich tun?

Der Wrapper unterstützt nicht direkt ausführbare "jar"-Dateien. Aber dies kann einfach behoben werden.

Der erste Schritt ist es, herauszufinden, welche Klasse wirklich ausgeführt wird, wenn die JVM die jar ausführt. Sie müssen den Inhalt einer jar-Datei in ein temp-Verzeichnis expandieren. Eine jar-Datei ist nichts Anderes als eine eingebildete ZIP-Datei, so können Sie entweder Ihr bevorzugtes ZIP-Utility oder das jar-Utility benutzen, welches mit Java mitgeliefert wird.

Innerhalb der jar-Datei finden Sie den Dateinamen, meta-inf/Manifest.mf. Öffnen Sie diese in einem Editor kommt etwas, wie das Folgende, zum Vorschein:

Beispiel: ("Manifest.mf" Datei)
Manifest-Version: 1.0
Main-Class: com.myco.myapp.Main

Die Übergabe von -jar parameter und einer jar-Datei zu Java veranlasst diese den oben genannten Main-Class-Name zu lesen, und diesen zu nutzen, um die Anwendung auszuführen. So, um den Wrapper dazu zu bewegen, die gleiche Anwendung zu starten, müssen wir die ausführbare jar-Datei dem Wrapper-Classpath zusammen mit allen anderen jars hinzufügen. Folgen Sie den normalen Integrationsschritten unter Nutzung der Main-Class als der Main-Class der Anwendung.

Die JVM beendet sich unerwartet bei der Anforderung eines Thread-Dumps.

Wenn ich einen Thread-Dump durch Drücken der Taste CTRL-BREAK,CTRL-\, oder via die API anfordere, erhalte ich die folgende Nachricht im Log und die JVM wird neu gestartet:

Log-Nachricht:
wrapper  | JVM exited unexpectedly.

Bitte stellen Sie sicher, dass Sie nicht den -Xrs Flag weiter bestimmen, wenn Sie die JVM starten. Dieses Flag ist in einigen Umgebungen, wenn Sie Java ohne den Wrapper einsetzen, sinnvoll. Aber es beeinträchtigt die Fähigkeit des Wrappers, auf verschiedene Systemsignale zu reagieren.

Um den Wrapper und so auch seiner JVM mitzuteilen, Systemsignale zu ignorieren, nutzen Sie stattdessen die Eigenschaft wrapper.ignore_signals. Stellen Sie bitte sicher, dass Sie zuerst das Dokument gelesen haben.

Meine Anwendung benutzt die Windows COM API, aber diese funktioniert mit dem Wrapper nicht.

Einige Nutzer berichteten von Problemen beim Versuch, Ihre COM-Anwendungen mit dem Wrapper zum Laufen zu bringen. Die Anwendung läuft problemlos unabhängig als eine Standalone-Anwendung, aber wenn diese unter dem Wrapper läufen, treten Fehler wie folgt auf:

Fehlermeldung:
Caught java.lang.NullPointerException: name can't be null while loading driver com.sun.comm.Win32Driver

Die COM API erfordert, dsss zwei Dateien verfügbar sind. Die win32com.dll Datei im library-Verzeichnis, und eine javax.comm.properties Datei, die sich in dem lib-Unterverzeichnis des Verzeichnis, welches von der System.getProperty("java.home") zurückgegeben wird, befindet.

Probleme können auftreten, wenn Ihre wrapper.conf so konfiguriert wurde, dass Sie eine andere JVM benutzen als diese, welche durch Ihre JAVA_HOME Umgebungsvariable festgelegt wurde. Sie können sicherstellen, dass Sie die korrekte JVM benutzen, indem Sie die folgende Eigenschaft wrapper.java.command in Ihrer wrapper.conf Datei festlegen.

Beispiel einer "wrapper.conf" Datei:
wrapper.java.command=%JAVA_HOME%/bin/java

Meine Anwendung gibt Sicherheitsausnahmefehler aus, wenn ich den den Wrapper starte.

Der einzige Unterschied zwischen der Art, wie Ihre Anwendung unter dem Wrapper läuft und der Art, wie sie läuft, bevor sie in diesen integriert wurde, ist der, dass zuvor die Main-Methode Ihrer Anwendung direkt durch die JVM beim Hochstarten aufgerufen wurde. Jetzt, angenommen, dass Sie die Helper-Klassen WrapperSimpleApp oder WrapperStartStopApp benutzen, wird die JVM zuerst die Main-Methode der Klasse aufrufen und danach, nachdem der Wrapper initialisiert wurde, wird es die Main-Methode Ihrer Anwendung aufrufen.

Dies kann ein paar Probleme verursachen, wenn ein Security Manager in Benutzung ist. Der Grund ist der, dass der Java Security Manager einen Call Stack durchsucht, um sicherzustellen, dass jede Klasse und Methode authorisiert wurde, den geschützten Programmcode aufzurufen, bevor Zugang gewährt wird. Wenn die Klassen des Wrappers in Ihrem Call-Stack existieren und ihnen keine besonderen Rechte gegeben wurden, dann erhalten Sie einen Sicherheitsfehler.

Versuchen Sie bitte wrapper.jar Berechtigungen zu geben, indem Sie das Folgende Ihrer Sicherheits-Datei hinzufügen. Dies löst gewöhnlich so ein Problem.

Sicherheits-Datei:
// Give Wrapper classes full permissions
grant codeBase "file:../lib/wrapper.jar" {
    permission java.security.AllPermission;
};

Kümmert sich der Wrapper um das Problem der JVMs, die sich beenden, wenn sich ein User unter Windows abmeldet?

Einige Javadienst-Anwendungen haben ein Problem mit dem Javaprozess, der sich beendet, wann immer sich ein Benutzer von Windows abmeldet. Wrapper hat dies seit seinem ersten Release gut erledigen können.

Die Java-Seite des Wrappers erfordert eine Native Library: Windows: wrapper.dll, Linux/UNIX: libwrapper.soum diese Arbeit zu erledigen. Die Native library ist verantwortlich für das Einfangen aller Systemsignale, die an den JVM-Prozess geschickt wurden und diese dann korrekt zu behandeln. Ein Java-Anwendung kann mit diesen Signalen umgehen, indem die Methode controlEvent in die WrapperListener Schnittstelle eingegestellt wird.

Wenn Sie irgendwelche Probleme mit Ihrer JVM begegnen, nachdem diese bei der Abmeldung eines Users durch den Wrapper neu gestartet wurde, überprüfen Sie bitte, ob die Library geladen wurde. Wenn dies nicht der Fall ist, erhalten Sie in der JVM-Ausgabe während der WrapperManager-Initialisierung eine Warnungsmeldung.

Sie können Beispiele bezüglich dem, was passiert, wenn der User sich - während der Wrapper als Konsolenanwendung und als Dienst läuft - abmeldet, im Abschnitt Beispiele der Dokumentation erhalten.

Wie kann ich die Prioritätsstufe, auf der meine Anwendung im System läuft, ändern?

Auf Windows-Systemen kann die Priorität durch das Festlegen der wrapper.ntservice.process_priority Eigenschaft in der wrapper.conf Datei eingestellt werden. Besuchen Sie bitte die Konfigurationsübersicht bezüglich mehr Details.

Auf UNIX-Systemen ist die empfohlene Methode für das Festlegen der Prioritätsstufe der "nice" Befehl in Ihren Shell-Skripten, wenn Sie den Wrapper starten. Die Beispielskripte, die mit dem Wrapper ausgeliefert werdern, zeigen, wie dies geht. Sehen Sie unter "man nice" oder "info nice", um Details darüber zu erhalten, wie "nice" genutzt werden kann.

Wie kann ich das User-Verzeichnis meiner Anwendung ändern?

Standardmäßig legt der Wrapper das JVM-Benutzerverzeichnis entweder auf das Standardverzeichnis entweder der wrapper.exe Datei unter Windows oder des Wrapper-Shellskripts auf UNIX-Systemen fest. Dies wird getan, um es zu ermöglichen, zuverlässig auf relative Verzeichnisangaben inenrhalb Ihrer Anwendung zugreifen zu können. Normalerweise wäre dies nicht möglich, da das Benutzerverzeichnis davon abhängt, von wo normalerweise die JVM gestartet wird.

Relative Pfadangaben machen es sehr einfach, eine Anwendung zu installieren, als ob sie gewöhnlich in irgendein Verzeichnis entzippt und zuverlässig ausgeführt würden.

Es gibt einige Fälle, in denen es notwendig ist, das Benutzerverzeichnis auf einen anderen Ort als gewöhnlich einzustellen. Dies wird durch das Setzen der wrapper.working.dir Eigenschaft erledigt.

NOTE

Wichtig - stellen Sie sicher, dass Sie die Dokumentation für die Arbeitsverzeichnis-Eigenschaft gelesen haben, bevor Sie damit experimentieren. Das wird Ihnen ein paar unnötige Sorgen ersparen.

I have mehrere Wrappers und JVMs im Einsatz, wie kann ich im Windows Task Manager erkennen, welche welche ist?

Beim Ausführen von mehreren Kopien des Wrappers unter Windows, ist es nicht einfach festzustellen, welche Anwendung welche im Task-Manager ist, weil alle darin als wrapper.exe und java.exe erscheinen. Es ist für den Wrapper nicht möglich ist, ein Feature zu implementieren, um diesen Namen zu ändern, weil Windows dies aufgrund von sicherheitsrelevanten Gründen nicht erlaubt.

Der Workaround kostet gewisse Anstrengungen, funktioniert aber gut.

  • Benennen Sie die wrapper.exe Datei in wrapper-myapp.exe um.
  • Dann ändern Sie die Batch-Dateien so ab, dass sie die diese neue Datei wrapper-myapp.exe benutzen.
  • Für den Javaprozess müssen Sie das Gleiche tun. Gehen Sie bitte in das %JAVA_HOME%/bin Verzeichnis und kopieren Sie einfach java.exe und benennen Sie die Kopie als java-myapp.exe.
  • Dann ändern Sie die wrapper.conf Datei, so dass die neue Datei java-myapp.exe benutzt wird.

Wenn Sie nun in den Windows Task Manager sehen, wird es nun einfach sein, zu unterscheiden, welche Datei welche ist.

Beachten Sie, dass Sie auch die wrapper.pidfile und die wrapper.java.pidfile Eigenschaften in der wrapper.conf Datei einstellen können. Diese werden Dateien erstellen, die Pids enthalten. Diese Pids können dann mit diesen verglichen werden, die im Task-Manager angezeigt werden. Beachten Sie, dass Sie den Task Manager konfigurieren müssen, um die Prozess-IDs anzuzeigen.

Wie führe ich den Wrapper unter einen bestimmten Usernamen aus?

Unter Windows wird dies durch das Festlegen der wrapper.ntservice.account Eigenschaft getan. Stellen Sie sicher, die Dokumentation kommplett zu lesen und dann den Dienst neu zu installieren.

Unter UNIX wird dies durch das Bestimmen der RUN_AS_USER -Variable des Wrappers-Shellskripts festgelegt src/bin/sh.script.in. Wenn Sie den Konsolen-Befehl ausführen, wird der Wrapper mit dem gegenwärtigen User-Konto ausgeführt. Wenn Sie jedoch den start -Befehl ausführen, ändert sich das User-Konto jedoch zum gegenwärtig genutzten User-Konto und startet dann den Wrapper. Dies bedeutet, dass der aktuelle User die Berechtigung braucht, Users zu ändern.

Wie kann ich meine Java-Anwendung überwachen, die als Windows Dienst mit Visual VM interagiert?

Wenn eine Java-Anwendung als ein Windows-Dienst ausgeführt wird, läuft es tatsächlich nicht im gleichen Sitzungskontext, wie die des Users, der Visual VM gestartet hat. Daher kann Visual VM die Java-Anwendung standardmässig nicht finden.

Bis Windows XP machten die laxen Sicherheitsrichtlinien für Windows Dienste es möglich, dies ziemlich einfach mit folgenden Schritten zu lösen:

Zum Zeitpunkt, wenn die JVM gestartet wird, schreibt die JVM ihre Prozess- und Hook-Information an die Stelle, die von der Umgebungsvariable %TMP% bestimmt wurde. Bitte beachten Sie, dass einige Umgebungsvariablen (inclusive dieser) für jeden User unterschiedlich festgelegt wurden. So müssen die zwei Prozesse, Ihre Anwendung&Visual VM, mit dieser Umgebungsvariablen synchronisiert werden.

Bitte setzen Sie die Umgebungsvariable "TMP" für den Wrapper-Prozess in Ihrer Wrapper-Konfigurationsdatei:
set.TMP=C:\tmp

Nachdem dies getan ist, starten Sie bitte den Dienst neu. Starten Sie nun eine Konsole und setzen Sie die TMP-Umgebungsvariable auf den gleichen Wert, den Sie in der Konfigurationsdatei angegeben haben:

Befehl:
set TMP=C:\tmp
C:\Program Files\...\jvisualvm.exe

Visual VM sollte nun in der Lage sein, den Javaprozess aufzulisten.

Während das Obengenannte für Windows-Versionen bis Windows XP zutrifft, werden Windows Vista/7 (und neuere Versionen) dies wahrscheinlich aufgrund von strengeren Sicherheitsmassnahmen nicht mehr zulassen. So ist der einzige Weg, dies zu lösen, die JMX Remote Monitoring Einstellungen (dies setzt mindestens Java 1.5 voraus) zu benutzen.

Bitte legen Sie folgende Eigenschaften in Ihrer Wrapper-Konfigurationsdatei fest:
wrapper.java.additional.N=-Dcom.sun.management.jmxremote.port=XXXX
wrapper.java.additional.N=-Dcom.sun.management.jmxremote.ssl=false
wrapper.java.additional.N=-Dcom.sun.management.jmxremote.authenticate=false

Bitte benutzen Sie ungenutzte Nummern für 'N' mit der wrapper.java.additional.<n> Eigenschaft und ersetzen Sie 'XXXX' durch eine ungenutzte Port-NummerZahl Ihrer Maschine. Innerhalb VisualVM wählen Sie bitte "File"-> "Add JMX Connection". Im Feld "Connection" geben Sie bitte "localhost:XXXX" ein (XXXX ist der Port, den Sie in der conf-Datei zugewiesen haben).

INFO

Für mehr Informationen bzgl. JMX Monitoring & Management, schauen Sie bitte auf unserer JMX Control Site oder besuchen Sie auch die Dokumentation von Oracle.