Configurazione delle librerie native nelle librerie condivise

Le librerie native sono file di libreria specifici della piattaforma, inclusi.dll ,.so o oggetti *SRVPGM, che possono essere configurati all'interno delle librerie condivise. Le librerie native sono visibili a un caricatore di classi dell'applicazione ogni volta che la libreria condivisa è associata a un'applicazione. Allo stesso modo, le librerie native sono visibili a un caricatore di classi del server delle applicazioni ogni volta che la libreria condivisa è associata a un server delle applicazioni.

Prima di iniziare

Quando si progetta una libreria condivisa, considerare le seguenti condizioni relative al supporto della libreria nativa Java:
  • La Java virtual machine (JVM) consente a un solo caricatore di classi di caricare una particolare libreria nativa.
  • Non esiste un'interfaccia di programmazione dell'applicazione (API) per scaricare una libreria nativa da un caricatore di classi.

    Le librerie native vengono scaricate dalla JVM quando il caricatore di classi che ha trovato la libreria viene raccolto dall'heap durante la garbage collection.

  • I programmi di caricamento classi del server delle applicazioni, a differenza del caricatore di classi JVM nativo, caricano solo le librerie condivise native che utilizzano l'estensione predefinita del sistema operativo per la piattaforma corrente. Ad esempio, su AIX, le librerie condivise native devono terminare con.a quando caricato dai caricatori di classi del server delle applicazioni. Il caricatore di classi JVM carica i file che terminano con.a O.so .

    [AIX]Java Web Start può caricare librerie condivise native solo con l'estensione file .so. Rinominare eventuali librerie condivise native in modo che abbiano l'estensione file .so prima di comprimerle in un file JAR (Java Archive) per la distribuzione Java Web Start.

  • I caricatori di classi del server delle applicazioni persistono per tutta la durata del server delle applicazioni.
  • I caricatori di classi dell'applicazione persistono finché un'applicazione non viene arrestata o ricaricata dinamicamente.

    Se una libreria condivisa configurata con un percorso di libreria nativa è associata a un'applicazione, ogni volta che l'applicazione viene riavviata o ricaricata dinamicamente l'applicazione potrebbe non riuscire con un UnsatisfiedLinkError indicando che la libreria è già caricata. L'errore si verifica perché, al riavvio, l'applicazione richiama la classe della libreria condivisa per ricaricare la libreria nativa. La libreria nativa, tuttavia, è ancora caricata in memoria poiché il caricatore di classi dell'applicazione che precedentemente caricava la libreria nativa non è stato ancora sottoposto a Garbage Collection.

  • Solo il caricatore di classi JVM può caricare una libreria nativa dipendente.

    Ad esempio, se NativeLib1 dipende da NativeLib2, Poi NativeLib2 deve essere visibile al caricatore di classi JVM. Il percorso contenente NativeLib2 deve essere specificato nel percorso della libreria Java definito dalla variabile di ambiente LIBPATH.

    [z/OS]Il LIBPATH (java.library.path ) la proprietà è configurata utilizzando il fileprocess_name_region_libpath variabile d'ambiente, comecontrol_region_libpath ,server_region_libpath , Oadjunct_region_libpath . Per istruzioni su come impostare le variabili LIBPATH della regione, vedere Modifica dei valori delle variabili a cui si fa riferimento in BBOM0001I messaggi.

    Se una libreria nativa configurata in una libreria condivisa dipende da altre librerie native, le librerie dipendenti devono essere configurate su LIBPATH della JVM che ospita il server delle applicazioni affinché tale libreria venga caricata correttamente.

Informazioni su questa attività

Quando si configura una libreria condivisa su a pagina delle impostazioni della libreria condivisa, se specifichi un valore per Percorso della libreria nativa, le librerie native su questo percorso non vengono individuate da WebSphere® Application Server caricatori di classi dell'applicazione o della libreria condivisa a meno che la classe che carica la libreria nativa non sia stata essa stessa caricata dallo stesso caricatore di classi.

Poiché una libreria nativa non può essere caricata più di una volta da un caricatore di classi, è preferibile che le librerie native vengano caricate all'interno di librerie condivise associate al caricatore di classi di un server delle applicazioni, poiché questi caricatori di classi persistono per tutta la durata del server.

Procedura

  1. Implementare un metodo statico nella classe che carica la libreria nativa.

    Nella classe che carica la libreria nativa, chiamaSystem.loadLibrary(native_library) in un blocco statico. Ad esempio:

    static {System.loadLibrary("native_library");

    libreria_nativa viene caricato durante l'inizializzazione statica della classe, che avviene esattamente una volta al caricamento della classe.

  2. Sul pagina delle impostazioni della libreria condivisa, impostare i valori per Percorso di classe E Percorso della libreria nativa che consentono alla libreria condivisa di caricare la libreria nativa.

    Se desideri associare la tua libreria condivisa a un'applicazione o a un modulo, seleziona anche Utilizza un caricatore di classi isolato per questa libreria condivisa. Se non si abilita questa impostazione, associare la libreria condivisa a un server delle applicazioni.

  3. Associa la libreria condivisa.
    • Se non hai abilitato Utilizza un caricatore di classi isolato per questa libreria condivisa, associare la libreria condivisa a un server delle applicazioni.

      L'associazione di una libreria condivisa al caricatore di classi di un server delle applicazioni, anziché a un'applicazione, garantisce che la libreria condivisa venga caricata esattamente una volta dal caricatore di classi del server delle applicazioni, anche se le applicazioni sul server vengono riavviate o ricaricate dinamicamente. Poiché la libreria nativa viene caricata all'interno di un blocco statico, non viene mai caricata più di una volta.

    • Se hai abilitato Utilizza un caricatore di classi isolato per questa libreria condivisa, associare la libreria condivisa a un'applicazione o un modulo.

      L'associazione di un file di libreria condivisa isolato con un'applicazione o un modulo carica le classi rappresentate dalla libreria condivisa in un caricatore di classi separato creato per quella libreria condivisa. Non associare un file di libreria condivisa isolato a un server se si desidera un caricatore di classi separato per una libreria condivisa. Se si associa la libreria condivisa a un server, il prodotto ignora l'impostazione di isolamento e aggiunge comunque i file nella libreria condivisa al caricatore di classi del server delle applicazioni. Cioè, l'associazione di un file di libreria condivisa isolato a un server associa il file a tutte le applicazioni sul server.

      Il caricatore di classi creato per una libreria condivisa isolata non si ricarica e, come un caricatore di classi del server, esiste per tutta la durata di un server. Per le librerie native condivise, è possibile utilizzare una libreria condivisa isolata per evitare errori derivanti dal ricaricamento delle librerie native.

Operazioni successive

Per verificare che un'applicazione possa utilizzare una libreria condivisa, testare l'applicazione o esaminare il caricatore di classi nel visualizzatore del caricatore di classi. Clic Risoluzione dei problemi > Visualizzatore caricatore di classi > nome_modulo > Visualizzazione tabella . Il percorso classi del caricatore classi del modulo applicativo elenca le classi utilizzate dalla libreria condivisa.