Java-native Bibliothek auf Anwendungsservern verwenden

Die Java Native Library (JNL) ist ein JAR-Archiv, das JNI-Code und Objekte enthält, die das Betriebssystem als gemeinsam genutzte Bibliotheken laden kann. Auf diese Weise können Sie Funktionen, die mit plattformspezifischen Methoden implementiert wurden, aus einer Java-Anwendung aufrufen. Möglichkeiten zum Erstellen von JNL werden in einem separaten großen Artikel behandelt. Wir sind daher der Ansicht, dass Sie bereits über JNL verfügen und es in Ihrer Anwendung verwenden möchten. Informationen zu den Funktionen der Verwendung von JNL in Anwendungen, die unter dem Anwendungsserver ausgeführt werden, finden Sie in diesem Artikel.

Die Verwendung von JNL hat die folgenden negativen Konsequenzen:
  • JNL-Code wird außerhalb der Java-Maschine ausgeführt, was zu Sicherheitsproblemen führen kann.
  • JNL selbst verfügt höchstwahrscheinlich über eine begrenzte Anzahl unterstützter Plattformen (Kombinationen „Betriebssystem“ - „Prozessor“). Dementsprechend schlägt der Versuch fehl, eine Anwendung mit JNL auf einer Plattform zu starten, die JNL nicht unterstützt.

In einigen Fällen ist es jedoch unmöglich, auf JNL zu verzichten. Beispiele sind:
  • die Notwendigkeit, die Betriebssystem-API direkt von einer Java-Anwendung aus zu verwenden (zum Beispiel, um das Arbeiten mit seriellen E / A-Ports zu implementieren);
  • die Notwendigkeit, Schwergewichtsalgorithmen (wie das Transcodieren von Medien) zu implementieren.

Die Verwendung von JNL in eigenständigen Anwendungen unterscheidet sich praktisch nicht von der Verwendung regulärer Java-Bibliotheken. Das heißt Voraussetzung ist die Position der JNL an einem Ort, der dem Klassenladeprogramm bekannt ist (normalerweise reicht es aus, die Bibliothek irgendwo im Klassenpfad zu platzieren). Manchmal ist es jedoch erforderlich, JNL in einem Verzeichnis abzulegen, auf das der System-Bootloader direkt zugreifen kann.

Wenn die Anwendung jedoch für die Ausführung auf einem Anwendungsserver ausgelegt ist, schlägt das einfache Poppen einer JNL WAR / EAR-Datei und das Installieren zusammen mit der Anwendung auf dem Server fehl. Der Grund liegt auf der Hand: eine mögliche Sicherheitslücke. Eine Anwendung mit JNL erhält Zugriff auf das Betriebssystem mit den Berechtigungen des Anwendungsservers (dies ist mindestens der Fall). Der Anwendungsserver verfügt über ein eigenes Sicherheitssystem, und das Umgehen auf die Benutzeranwendung ist in gewisser Weise nicht umständlich.

Wenn Sie also die JNL direkt in die EAR oder WAR stecken, stürzt die Anwendung natürlich ab. Wenn Sie jedoch versuchen, den JNI-Code aufzurufen, tritt eine Ausnahme auf (höchstwahrscheinlich java.lang.UnsatisfiedLinkErrormit der Native Library-Diagnose, die bereits in einem anderen Klassenladeprogramm geladen ist).

Die Verwendung von JNL auf einem Anwendungsserver ist also absolut unmöglich? In der Tat ist dies nicht so. Es ist lediglich erforderlich, dem Anwendungsserver selbst zu erklären, dass JNL legal verwendet wird (und wahrscheinlich wird die Verwendung für den Anwendungsserver selbst mehr oder weniger sicher sein). Nun und weiter beginnen die Feinheiten, die von einem bestimmten Anwendungsserver abhängen.

In jedem Fall müssen Sie beim Kompilieren von Java-Code den Pfad zur verwendeten JNL angeben (um auf die darin enthaltenen Java-Klassen verweisen zu können), aber es ist nicht erforderlich, sie in eine EAR / WAR- oder JAR-Datei zu packen, die für die Bereitstellung vorgesehen ist. Was als Nächstes zu tun ist, hängt vom Zielanwendungsserver ab.

Glassfish 3.x, 4.x

Sie müssen die JNL in das Domänenverzeichnis / lib oder das Domänenverzeichnis / lib / ext kopieren (in diesem Fall ist die JNL für alle Anwendungen verfügbar). In der Glassfish-Konfiguration und in der Benutzeranwendung sind keine zusätzlichen Änderungen erforderlich.

WildFly, Jboss

Hier ist es etwas komplizierter. Die Reihenfolge der Aktionen ist wie folgt:
  • Erstellen Sie eine Reihe von Verzeichnissen des Formulars in $ JBOSS_ROOT / modules:
    $ JBOSS_ROOT / modules / path / to / my / module / main
  • Kopieren Sie die erforderliche JNL in das Verzeichnis:
    $ JBOSS_ROOT / modules / path / to / my / module / main
  • An derselben Stelle erstellen wir eine Textdatei mit dem Namen module.xml und dem folgenden Inhalt:

  • Fügen Sie in der Anwendung, die JNL verwenden möchte, die Zeile in der Datei MANIFEST.MF (in / META-INF) hinzu:
    Abhängigkeiten: Gewünscht Name meines Modulexports

    Wir fügen den Parameter "export" hinzu, wenn wir unsere JNL nicht nur für das aktuelle Modul, sondern auch für andere darin enthaltene Module (z. B. innerhalb der EAR) verfügbar machen möchten.

Jetzt auch beliebt: