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

Java Discussion :

Classpath et version de librairies externes


Sujet :

Java

  1. #1
    Membre habitué
    Inscrit en
    Janvier 2005
    Messages
    491
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 491
    Points : 172
    Points
    172
    Par défaut Classpath et version de librairies externes
    Hello,

    J'ai une application qui dépends d'une librairie A.jar et d'une librairie B.jar. Le problème est que la librairie A dépends également de B.jar, et l'encapsule dirèctement dans le .jar.

    Du coup, lorsque je lance mon application, la librairie B me renvoi un message comme quoi il détecte deux version.

    Dans de tels cas, je sais qu'il utilise la première qu'il trouve... Perso, je souhaiterai que mon application utilise la version que je lui indique, et que A utilise la sienne.

    Est-ce possible d'une quelconque manière ? Comment régler ce type de problème ?

    Merci d'avance!

  2. #2
    Rédacteur
    Avatar de CyberChouan
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    2 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 752
    Points : 4 314
    Points
    4 314
    Par défaut
    A moins de créer ton propre classloader, ce n'est pas possible.

    La solution la plus simple pour réaliser cette opération est de "repackager" la librairie B dont dépend A (en préfixant par "a.dependency." par exemple).

    Ainsi, les deux librairies seront différentes, et chacun utilisera la sienne sans empiéter sur l'autre.

    Attention toutefois à ce que la licence de la librairie autorise un tel repackaging si elle ne vous appartient pas.
    Avant de poster, pensez à regarder la FAQ, les tutoriaux, la Javadoc (de la JRE que vous utilisez) et à faire une recherche
    Je ne réponds pas aux questions techniques par MP: les forums sont faits pour ça
    Mes articles et tutoriaux & Mon blog informatique

  3. #3
    Membre habitué
    Inscrit en
    Janvier 2005
    Messages
    491
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 491
    Points : 172
    Points
    172
    Par défaut
    Créer son propre class loader... Je ne suis pâs familier avec ca: ca prends du temps ? Est-ce que ca peut impacter les performances de l'application ?

    Merci en tout cas de ta réponse

  4. #4
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par vinzzzz Voir le message
    Créer son propre class loader... Je ne suis pâs familier avec ca: ca prends du temps ? Est-ce que ca peut impacter les performances de l'application ?

    Merci en tout cas de ta réponse
    ca prend du temps, c'est galère, et ca va surtout impacter votre code. C'est le principe des plugins avec isolation entre les plugins, mais ca nécessite du coup que, chaque vois que dans votre code principal vous voulez instanciez des trucs dans A, vous passiez soit par une factory fournie par A, soit par le classLoader, sa méthode forName, les Constructeur par reflexion. Bref dans le premier cas, il faut une libiraire qui est déjà prévue pour ça (système de plugin), ce qui n'est vraissemblablement pas le cas ici, dans le deuxième cas, il faudra à chaque fois 10 lignes de code pour faire l'équivalent d'un "new MachinDansA();"

    Je maudit à chaque fois les auteurs de librairies qui ont l'idée "lumineuse" de packager dans leur jar une librairie tierce . Doivent pas connaitre des masses les grosses applications eux. Bref, personellement, la solution que je trouve la plus facile en général:

    ouvrir A.jar (avec winzip, file-roller ou autre)
    retirer toutes les classes provenant de B
    sauver le jar

    et j'obtiens au final un A.jar qui utilisera le B.jar que je lui fournirais et rien d'autre !

  5. #5
    Membre chevronné
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Points : 1 984
    Points
    1 984
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    Bref, personellement, la solution que je trouve la plus facile en général:

    ouvrir A.jar (avec winzip, file-roller ou autre)
    retirer toutes les classes provenant de B
    sauver le jar

    et j'obtiens au final un A.jar qui utilisera le B.jar que je lui fournirais et rien d'autre !
    Sauf que la librairie A qui utilisait B peut ne plus marcher puisque B est d'une version différente
    Mais c'est sur que c'est mieux d'embarquer 1 seule fois B...

  6. #6
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par hwoarang Voir le message
    Sauf que la librairie A qui utilisait B peut ne plus marcher puisque B est d'une version différente
    Mais c'est sur que c'est mieux d'embarquer 1 seule fois B...
    Si il y a incompatibilité entre les deux versions (ce qui n'est pas certains, ici le problème est la duplication de la libiraire), il faudra choisir:

    soit utiliser la vieille version de B uniquement,
    soit ne pas utiliser A.

Discussions similaires

  1. Configuration classpath librairie externe
    Par croc14 dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 20/10/2009, 13h06
  2. [JAR] Archive qui ne prend pas en compte librairie externe
    Par Shiryu44 dans le forum Général Java
    Réponses: 3
    Dernier message: 22/04/2005, 13h59
  3. [ClassPath]Comment inclure les librairies dans un .BAT
    Par Kyti dans le forum Général Java
    Réponses: 2
    Dernier message: 26/03/2005, 08h07
  4. [Debutant] Ajout de librairie externe
    Par hat54 dans le forum MFC
    Réponses: 2
    Dernier message: 26/04/2004, 17h15
  5. Creer et utiliser une librairie externe à l'exécutable
    Par multani dans le forum Autres éditeurs
    Réponses: 7
    Dernier message: 06/11/2003, 10h11

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