Native Bibliotheken sind plattformspezifische Dateien. Dazu gehören Dateien mit den Erweiterungen
.dll und .so sowie *SRVPGM-Objekte, die in gemeinsam genutzten Bibliotheken konfiguriert werden können. Native
Bibliotheken sind für einen Anwendungsklassenlader sichtbar, wenn die gemeinsam genutzte Bibliothek einer Anwendung zugeordnet ist.
Native Bibliotheken sind für den Klassenlader eines Anwendungsservers sichtbar, wenn die gemeinsam genutzte Bibliothek einem Anwendungsserver zugeordnet ist.
Vorbereitende Schritte
Wenn Sie eine gemeinsam genutzte Bibliothek entwerfen, müssen Sie in Bezug auf die Unterstützung nativer Java-Bibliotheken Folgendes berücksichtigen:
- Die Java Virtual Machine (JVM) bestimmt, dass jeweils ein bestimmter Klassenlader eine bestimmte native Bibliothek lädt.
- Es ist keine Anwendungsprogrammierschnittstelle (API) vorhanden, um eine native Bibliothek aus einem Klassenlader zu entladen.
Native Bibliotheken werden von der JVM entladen, wenn der Klassenlader, der die Bibliothek gefunden hat,
von der Garbage-Collection für den Heapspeicher erfasst wird.
- Klassenlader für Anwendungsserver laden anders als native JVM-Klassenlader nur native
gemeinsam genutzte Bibliotheken, die die Standarderweiterung des Betriebssystems für die aktuelle Plattform verwenden.
Unter AIX, müssen native gemeinsam genutzte Bibliotheken beispielsweise die Erweiterung
.a haben, wenn sie von Klassenladern des Anwendungsservers geladen werden.
Der JVM-Klassenlader lädt Dateien mit der Erweiterung .a oder .so.
Java Web Start kann nur native
gemeinsam genutzte Bibliotheken mit der Dateierweiterung ".so" laden.
Benennen Sie alle nativen gemeinsam genutzten Bibliotheken so um, dass sie die
Dateierweiterung ".so" haben, bevor Sie sie für die Implementierung mit Java Web Start in eine JAR-Datei (Java-Archiv) packen.
- Klassenlader für Anwendungsserver bleiben für die Lebensdauer des
Anwendungsservers bestehen.
- Klassenlader für Anwendungen bleiben bestehen, bis eine Anwendung gestoppt
oder dynamisch erneut geladen wird.
Wenn eine gemeinsam genutzte Bibliothek, die mit
dem Pfad der nativen Bibliothek konfiguriert ist, einer Anwendung zugeordnet wird, kann
die Anwendung, wenn sie erneut gestartet oder dynamisch erneut geladen wird, mit einem
UnsatisfiedLinkError fehlschlagen, der anzeigt, dass die Bibliothek bereits geladen ist.
Der Fehler tritt auf, weil die Anwendung beim Neustart die Klasse der gemeinsam genutzten
Bibliothek aufruft, die dann die native Bibliothek erneut lädt. Die native Bibliothek
ist jedoch noch im Speicher geladen, da der Anwendungsklassenlader, der die native
Bibliothek zuvor geladen hat, noch nicht von der Garbage-Collection erfasst wurde.
- Nur der JVM-Klassenlader kann eine abhängige native Bibliothek laden.
Beispiel: Wenn NativeBibl1 von NativeBibl2 abhängig ist, muss
NativeBibl2 für den JVM-Klassenlader erkennbar sein. Der Pfad mit NativeLib2 muss im
Java-Bibliothekspfad, der mit der Umgebungsvariablen LIBPATH definiert wird, angegeben werden.
Die Eigenschaft LIBPATH (java.library.path) wird mit der Umgebungsvariablen
Prozessname_region_libpath konfiguriert, z. B.
control_region_libpath, server_region_libpath oder
adjunct_region_libpath. Anweisungen zum Definieren der Region-LIBPATH-Variablen enthält der Artikel
Werte der in BBOM0001I-Nachrichten referenzierten Variablen ändern.
Wenn eine native Bibliothek, die in einer gemeinsam genutzten Bibliothek konfiguriert ist,
von anderen nativen Bibliotheken abhängig ist, müssen die abhängigen Bibliotheken im
LIBPATH der JVM, auf der der Anwendungsserver sich befindet,
konfiguriert sein, damit diese Bibliothek geladen werden kann.
Informationen zu diesem Vorgang
Wenn Sie bei der Konfiguration einer gemeinsam genutzten Bibliothek auf einer
Seite mit Einstellungen für die gemeinsam
genutzte Bibliothek einen Wert für
Pfad der nativen Bibliothek angeben, werden die nativen Bibliotheken in
diesem Pfad nicht von den Klassenladern der Anwendung in
WebSphere Application Server oder der gemeinsam
genutzten Bibliothek erkannt, sofern die Klasse, die die native Bibliothek lädt, nicht
selbst vom selben Klassenlader geladen wurde.
Da eine native Bibliothek nicht
mehrmals von einem Klassenlader geladen werden kann, werden native Bibliotheken am
besten innerhalb gemeinsam genutzter Bibliotheken, die dem Klassenlader eines
Anwendungsservers zugeordnet sind, geladen, da diese Klassenlader für die
Lebensdauer des Servers bestehen bleiben.
Vorgehensweise
- Implementieren Sie eine statische Methode in der Klasse, die die native Bibliothek lädt.
Rufen Sie in der Klasse, die die native Bibliothek lädt,
System.loadLibrary(native_Bibliothek) in einem statischen Block auf. Beispiel:
static {System.loadLibrary("native_library");
native_Bibliothek
lädt die statische Initialisierung der Klasse, die beim Laden der Klasse exakt einmal auftritt.
- Setzen Sie auf der Seite mit den
Einstellungen für die gemeinsam genutzte Bibliothek Werte für
Klassenpfad und Pfad der nativen Bibliothek, die die gemeinsam genutzte
Bibliothek in die Lage versetzen, die native Bibliothek zu laden.
Wenn Sie
die gemeinsam genutzte Bibliothek einer Anwendung oder einem Modul zuordnen möchten, wählen Sie
auch die Option Isolierten Klassenlader für diese gemeinsam genutzte Bibliothek verwenden aus.
Wenn Sie diese Einstellung nicht aktivieren, ordnen Sie die gemeinsam genutzte Bibliothek einem Anwendungsserver zu.
- Ordnen Sie die gemeinsam genutzte Bibliothek zu.
- Wenn Sie die Option Isolierten Klassenlader für diese gemeinsam genutzte Bibliothek verwenden nicht aktiviert haben,
ordnen Sie die gemeinsam genutzte Bibliothek einem Anwendungsserver zu.
Wenn Sie eine gemeinsam genutzte Bibliothek dem Klassenlader eines
Anwendungsservers und nicht einer Anwendung zuordnen, stellen
Sie sicher, dass die gemeinsam genutzte Bibliothek vom Klassenlader des
Anwendungsservers exakt einmal geladen wird, obwohl Anwendungen auf dem
Server erneut gestartet oder dynamisch erneut geladen werden. Da die native
Bibliothek in einem statischen Block geladen wird, wird die native Bibliothek nie
mehr als einmal geladen.
- Wenn Sie die Option Isolierten Klassenlader für diese gemeinsam genutzte Bibliothek verwenden aktiviert haben,
ordnen Sie die gemeinsam genutzte Bibliothek einer Anwendung oder einem Modul zu.
Wenn
Sie eine isolierte gemeinsam genutzte Bibliotheksdatei einer Anwendung oder einem Modul zuordnen, werden die von
der gemeinsam genutzten Bibliothek dargestellten Klassen in einem gesonderten Klassenlader geladen, der für diese gemeinsam genutzte Bibliothek
erstellt wird.
Ordnen Sie eine isolierte gemeinsam genutzte Bibliotheksdatei einem Server nicht zu, wenn ein gesonderter
Klassenlader für eine gemeinsam genutzte Bibliothek verwendet werden soll.
Wenn Sie die gemeinsam genutzte Bibliothek einem Server zuordnen, ignoriert das Produkt die Isolationseinstellung und
fügt dem Klassenlader des Anwendungsservers weiterhin Dateien aus der gemeinsam genutzten Bibliothek zu.
Ordnen Sie also eine isolierte gemeinsam genutzte Bibliotheksdatei einem Server zu, wird die Datei allen
Anwendungen auf dem Server zugeordnet.
Der für eine isolierte gemeinsam genutzte Bibliothek erstellt Klassenlader wird nicht erneut geladen und bleibt wie ein Serverklassenlader
für die gesamte Lebensdauer eines Servers gültig. Für gemeinsam genutzte native Bibliotheken können Sie eine
isolierte gemeinsam genutzte Bibliothek verwenden, um Fehler zu vermeiden, die durch das erneute Laden nativer Bibliotheken auftreten.
Nächste Schritte
Um sicherzustellen, dass eine Anwendung eine gemeinsam genutzte Bibliothek verwenden kann, testen Sie die Anwendung, oder untersuchen
Sie den Klassenlader in der Anzeigefunktion für Klassenlader.
Klicken Sie auf . Im
Klassenpfad des Klassenladers für das Anwendungsmodul werden die von der gemeinsam genutzten Bibliothek verwendeten Klassen aufgelistet.