Configuration des bibliothèques natives dans les bibliothèques partagées

Les bibliothèques natives sont des fichiers de bibliothèque spécifiques à des plateformes, y compris des .dll, .so, ou des objets *SRVPGM, pouvant être configurés au sein de bibliothèques partagées. Les bibliothèques sont visibles pour un chargeur de classe d'application dès que la bibliothèque partagée est associée à une application. De la même façon, les bibliothèques natives sont visibles à un chargeur de serveur d'applications dès que la bibliothèque partagée est associée à un serveur d'applications.

Avant de commencer

Lors de la conception d'une bibliothèque partagée, respectez les conditions suivantes concernant la prise en charge de bibliothèque native Java :
  • La machine JVM ne permet qu'à un seul chargeur de classe de charger une bibliothèque native particulière.
  • Il n'existe pas d'API permettant de décharger une bibliothèque native d'un chargeur de classe.

    Les bibliothèques natives sont déchargées par JVM lorsque le chargeur de classe ayant trouvé la bibliothèque est collecté du segment de mémoire au cours de la récupération de place.

  • Les chargeurs de classe du serveur d'applications, à la différence du chargeur de classe JVM natif, chargent uniquement les bibliothèques partagées natives qui utilisent l'extension du système d'exploitation par défaut de la plateforme actuelle. Par exemple, sur AIX, l'extension des bibliothèques partagées natives doit se terminer par .a lorsqu'elles sont chargées par les chargeurs de classe du serveur d'applications. Le chargeur de classe JVM charge les fichiers se terminant par .a ou .so.

    [AIX]Java Web Start peut charger uniquement les bibliothèques partagées natives portant l'extension de fichier .so. Renommez les bibliothèques partagées natives avec l'extension .so avant de les regrouper dans un fichier JAR (Java archive) pour le déploiement Java Web Start.

  • Les chargeurs de serveur d'applications sont conservés pendant la durée du serveur d'applications.
  • Les chargeurs de classe d'applications sont conservés jusqu'à ce qu'une application soit interrompue ou dynamiquement rechargée.

    Si une bibliothèque partagée configurée avec un chemin d'accès à la bibliothèque native est associée à une application, lorsque l'application est redémarrée ou dynamiquement rechargée, elle risque d'échouer, avec une erreur UnsatisfiedLinkError indiquant que la bibliothèque est déjà chargée. L'erreur intervient car, lorsque l'application redémarre, elle demande à la classe de bibliothèque partagée de recharger la bibliothèque native. Toutefois, la bibliothèque native est encore chargée en mémoire dans le chargeur de classe d'applications qui avait précédemment chargé la bibliothèque native n'a pas encore subi le processus de récupération de place.

  • Seul un chargeur de classe JVM peut charger une bibliothèque native dépendante.

    Par exemple, si NativeLib1 est dépendante de NativeLib2, NativeLib2 doit être visible pour le chargeur de classe JVM. Le chemin contenantNativeLib2 doit être spécifié dans le chemin de bibliothèque Java défini par la variable d'environnement LIBPATH.

    [z/OS]Le LIBPATH (java.library.path ) la propriété est configurée à l'aide de laprocess_name_region_libpath variable d'environnement, telle quecontrol_region_libpath ,server_region_libpath , ouadjunct_region_libpath . Pour obtenir des instructions sur la façon de définir les variables de région LIBPATH, consultez Modification des valeurs des variables référencées dans BBOM0001I messages.

    Si une bibliothèque native configurée dans une bibliothèque partagée est dépendante d'autres bibliothèques natives, les bibliothèques dépendantes doivent être configurées sur le LIBPATH de la machine JVM hébergeant le serveur d'applications afin que cette librairie soit chargée correctement.

A propos de cette tâche

Lors de la configuration d'une bibliothèque partagée sur un page des paramètres de la bibliothèque partagée, si vous spécifiez une valeur pour Chemin de la bibliothèque native, les bibliothèques natives sur ce chemin ne sont pas localisées par le WebSphere® Application Server chargeurs de classes d'application ou de bibliothèque partagée, sauf si la classe qui charge la bibliothèque native a elle-même été chargée par le même chargeur de classe.

Comme une bibliothèque native ne peut pas être chargée plusieurs fois par un chargeur de classe, il est préférable que les bibliothèques natives soient chargées au sein des bibliothèques partagées associées au chargeur de classe d'un serveur d'applications, car ces chargeurs de classe existent pendant toute la durée de vie du serveur.

Procédure

  1. Mettez en oeuvre une méthode statique dans la classe chargeant la bibliothèque native.

    Dans la classe qui charge la bibliothèque native, appelezSystem.loadLibrary(native_library) dans un bloc statique. Par exemple :

    static {System.loadLibrary("native_library");

    bibliothèque_native charge pendant l'initialisation statique de la classe, qui se produit exactement une fois, lorsque la classe charge.

  2. Sur le page des paramètres de la bibliothèque partagée, définissez les valeurs pour Chemin de classe et Chemin de la bibliothèque native qui permettent à la bibliothèque partagée de charger la bibliothèque native.

    Si vous voulez associer votre bibliothèque partagée avec une application ou un module, sélectionnez Utiliser un chargeur de classes isolé pour cette bibliothèque partagée. Si vous ne voulez pas activer ce paramètre, associez la bibliothèque partagée avec un serveur d'applications.

  3. Associez la bibliothèque partagée.
    • Si vous n'avez pas activé Utilisez un chargeur de classe isolé pour cette bibliothèque partagée, associer la bibliothèque partagée à un serveur d'applications.

      Associer une bibliothèque partagée au chargeur de classe d'un serveur d'applications, au lieu d'une application, permet de garantir que la bibliothèque partagée est chargée exactement une fois par le chargeur de classe du serveur d'applications, même si les applications du serveur sont redémarrées ou dynamiquement rechargées. La bibliothèque native étant chargée au sein d'un bloc statique, la bibliothèque native n'est jamais chargée plusieurs fois.

    • Si vous avez activé Utilisez un chargeur de classe isolé pour cette bibliothèque partagée, associer la bibliothèque partagée à une application ou un module.

      L'association d'un fichier de bibliothèque partagée isolée avec une application ou un module charge les classes représentées par la bibliothèque partagée dans un chargeur de classe distinct créé pour cette bibliothèque partagée. N'associez pas un fichier de bibliothèque partagée avec un serveur si vous voulez un chargeur de classe distinct pour une bibliothèque partagée. Si vous associez la bibliothèque partagée à un serveur, le produit ignore le paramètre d'isolation et ajoute encore des fichiers de la bibliothèque partagée au chargeur de classes du serveur d'applications. Ainsi, associer un fichier de bibliothèque partagée isolée à un serveur permet d'associer le fichier à toutes les applications installées sur le serveur.

      Le chargeur de classe créé pour une bibliothèque partagée isolée ne se recharge pas et, à l'instar d'un chargeur de classe de serveur, dure pendant toute la vie d'un serveur. Pour les bibliothèques natives partagées, vous pouvez utiliser une bibliothèque partagée isolée pour éviter les erreurs provoquées par le rechargement des bibliothèques natives.

Etape suivante

Pour vérifier qu'une application peut utiliser une bibliothèque partagée, testez l'application ou examinez le chargeur de classe dans l'afficheur de chargeur de classe. Cliquez sur Dépannage > Visionneuse de chargeur de classe > nom_module > Vue de tableau . Le chemin d'accès aux classes du chargeur de classe du module de l'application module répertorie les classes utilisées par la bibliothèque partagée.