IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Java Discussion :

Comment utiliser deux versions différentes d'une même librairie ?


Sujet :

Langage Java

  1. #1
    Candidat au Club
    Inscrit en
    Juin 2010
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 6
    Points : 2
    Points
    2
    Par défaut Comment utiliser deux versions différentes d'une même librairie ?
    Bonjour,

    Je me décide enfin à poster sur ce forum car j'ai un problème que je n'arrive pas à résoudre seul. Je vais essayer d'être concis mais assez explicite.

    Dans mon code, je veux faire appel à une API qui nécessite l'utilisation d'une librairie. Toutefois, cette librairie est déjà utilisée - mais dans une version plus ancienne - par une autre API que j'exploite. Quand j'exécute le code, plusieurs exceptions sont levées, liées au fait que certaines méthodes n'existaient pas encore dans l'ancienne version de la librairie.

    La question est donc simple : comment faire pour choisir la bonne version de librairie au bon moment ? Au cours de mes recherches sur le net, je suis tombé sur la notion de "class loader", mais je n'ai su déterminer si elle me permettrait de résoudre mon problème...

  2. #2
    Membre éprouvé
    Inscrit en
    Mars 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mars 2006
    Messages : 848
    Points : 1 078
    Points
    1 078
    Par défaut
    Bonjour,

    Je vois deux possibilités :
    - si la version plus récente est compatible avec l'ancienne (= toutes les classes/méthodes de l'ancienne existent dans la nouvelle, avec les même signatures), tu dois pouvoir te contenter de garder seulement la plus récente dans ton classpath et virer l'ancienne.
    - sinon, tu vas effectivement devoir jouer avec 2 classloaders différents.

    Essaie la première option en priorité, cela te facilitera grandement la vie.

  3. #3
    Candidat au Club
    Inscrit en
    Juin 2010
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par Deaf Voir le message
    Bonjour,

    Je vois deux possibilités :
    - si la version plus récente est compatible avec l'ancienne (= toutes les classes/méthodes de l'ancienne existent dans la nouvelle, avec les même signatures), tu dois pouvoir te contenter de garder seulement la plus récente dans ton classpath et virer l'ancienne.
    - sinon, tu vas effectivement devoir jouer avec 2 classloaders différents.

    Essaie la première option en priorité, cela te facilitera grandement la vie.
    Visiblement, une des API appelle une méthode qui n'existait pas dans l'ancienne version de la librairie. L'inverse est également vrai, malheureusement. Cela rend donc la première option impossible.

    Je suis donc intéressé par la deuxième option, mais j'avoue ne avoir jamais avoir joué avec ces classloaders. Où pourrais-je en trouver une description (avec des exemples, si possible) ?

  4. #4
    Membre éprouvé
    Inscrit en
    Mars 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mars 2006
    Messages : 848
    Points : 1 078
    Points
    1 078
    Par défaut
    C'est pas de chance, la rétro-compatibilité est souvent assurée pour les librairies répandues...

    Je ne connais pas de tuto/cours sur les classloaders, mais en faisant une recherche sur ClassLoader et UrlClassLoader, y'a moyen d'en trouver. Après, mon méchant proxy du boulot m'a interdit d'aller les regarder pour en choisir un...

    Il se peux qu'il y ait quelques imprécisions/raccourcis dans la suite, mais l'idée sera là pour t'aider (je l'espère) à comprendre.

    Au début, la JVM créé un classloader qui se charge de loader toutes les classes du classpath. Chaque classe à son classloader associé (celui qui l'a chargée) et c'est par lui qu'elle va charger ses dépendances (lors d'une initialisation ou d'un appel statique).

    Après, il est possible de créer son propre classloader. Celui-ci aura comme parent un autre classloader. Cela signifie que si ton classloader ne connait pas une classe, il la demandera à son parent. Cela t'évite par exemple de recharger toutes les classes de la JRE...

    Donc l'idée pour toi est de faire en sorte que :
    - le classloader de ton code qui utilise l'ancienne librairie soit le même que celui qui a chargé l'ancienne librairie
    - le classloader de ton code qui utilise la nouvelle librairie soit le même que celui qui a chargé la nouvelle librairie
    - ces deux classloaders soient différents

    J'espère t'avoir aidé un peu

  5. #5
    Candidat au Club
    Inscrit en
    Juin 2010
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Merci pour la réponse, je suis donc allé voir le principe des ClassLoader de plus près. Malheureusement, un détail me chiffonne : ce n'est pas directement mon code qui utilise la librairie incriminée, mais des librairies que j'utilise dans mon code.

    En fait, j'ai du mal à voir comment je peux agir sur la résolution d'une classe de la librairie depuis une autre librairie. A moins de pouvoir directement remplacer par une version adéquate les classes problématiques chargées par la JVM, et ce juste avant l'appel fatidique dans mon code ? Cela me paraît d'autant plus risqué que j'ai plusieurs Threads simultanés et qu'il me semble impossible de garantir que ceux-ci n'auront jamais besoin en même temps des 2 versions de la librairie problématique...

    J'avoue que j'ai vraiment du mal à m'en sortir, toute aide serait la bienvenue. Merci d'avance

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 155
    Points : 199
    Points
    199
    Par défaut
    Ton system classloader charge ton code, mais aucune de tes quatres librairies.

    Tu crée un premier classloader qui va charger une librarie et sa librairie de dépendance.

    Tu crée un second classloader qui va charger l'autre librarie et sa librairie de dépendance.

    Quand tu veux créer un item de la librairie 1, tu utilise le premier classloader.
    Quand tu veux créer un item de la librairie 2, tu utilise le second classloader.

    J'ai jamais utilisé les classloader mais c'est ce que je comprend.

  7. #7
    Membre expérimenté
    Avatar de Patriarch24
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2003
    Messages
    1 047
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 047
    Points : 1 640
    Points
    1 640
    Par défaut
    Dans mon code, je veux faire appel à une API qui nécessite l'utilisation d'une librairie. Toutefois, cette librairie est déjà utilisée - mais dans une version plus ancienne - par une autre API que j'exploite.
    De quelle API s'agit-il ?

    Sinon, tu n'as pas vraiment le choix : tu dois utiliser des classloaders. Maintenant, le faire à la main, c'est lourdingue.

    A noter qu'OSGi résout ces problèmes : on peut utiliser plusieurs versions d'une même lib dans un même logiciel, chaque service ayant ses propres dépendances (car chargées dans différents classloaders !).

    Bon courage !
    En premier lieu, utilisez un moteur de recherche.
    En second lieu, postez sur le forum adéquat !

Discussions similaires

  1. Utiliser deux dll différentes dans une page aspx
    Par Sylvain_57 dans le forum Développement Sharepoint
    Réponses: 3
    Dernier message: 21/03/2011, 12h31
  2. Utilisation plusieurs versions IE sur une même machine
    Par ceweb dans le forum Balisage (X)HTML et validation W3C
    Réponses: 11
    Dernier message: 11/02/2010, 02h48
  3. Réponses: 1
    Dernier message: 23/10/2008, 17h58
  4. Deux formulaires différents dans une même page
    Par zabdaniel dans le forum Langage
    Réponses: 3
    Dernier message: 14/01/2008, 20h31
  5. [Débutant]Deux Threads différent dans une même classe?
    Par nicofromChina dans le forum Concurrence et multi-thread
    Réponses: 10
    Dernier message: 26/01/2007, 15h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo