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

Entrée/Sortie Java Discussion :

Empêcher le chargement des fichiers présents dans lib/ext


Sujet :

Entrée/Sortie Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5
    Par défaut Empêcher le chargement des fichiers présents dans lib/ext
    Bonjour,

    Je ne suis pas développeur, mais administrateur d'une application "A" qui fonctionne sous java.
    Cette application ne dépose aucun fichier JAR dans lib/ext.
    Cette application "A" fonctionne mal quand une autre application "B" utilisant aussi java est installée sur le poste.
    Il s'avère que l'application "B" dépose des fichiers JAR dans le repertoire lib/ext. Sur un poste de test sur lequel sont installées les deux applications, en supprimant les fichiers déposés par "B" dans lib/ext, "A" fonctionne correctement (mais plus "B", évidemment).

    Je suppose que les fichiers déposés par "B" dans lib/ext contiennent une classe qui est appelée par "A" et chargée normalement par celle-ci en aval de la procédure de chargement.

    Est-il possible, au lancement de l'application "A", de l'empêcher de charger les fichiers présents dans lib/ext (via une option par exemple). Le but est de pouvoir faire fonctionner les deux application sur un même poste.

    J'espère avoir été clair.

    gbtheone.

    PS : pour info, j'ai lu les rubriques classpath et compagnie de la FAQ générale. Mais je ne cherche pas à ajouter un chemin mais à en enlever qui semble être par défaut.

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 802
    Par défaut
    Le problème vient certainement du fait que les applications A et B utilisent des versions différentes d'une même librairie.

    Si les librairies sont bien identifiées, voici la solution :

    Pour commencer, il est impossible d'empêcher le chargement des librairies déposées dans $JAVA_HOME/lib/ext.

    En revanche, on peut demander à la jvm de charger en priorité une autre librairie, ce qui a pour effet de surcharger les librairies système. A noter que, comme la documentation le précise, il est interdit de distribuer une application qui surcharge rt.jar qui contient l'api standard.

    Donc, il faut ajouter l'option -Xbootclasspath/p:path à la jvm.

    Par exemple, si l'application A installe une librairie foo_1.jar dans $JAVA_HOME/lib/ext, et que cette librairie entre en conflit avec la librairie foo_2.jar située dans le CLASSPATH, il faut exécuter B avec la commande suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    java -Xbootclasspath/p:/path/to/foo_2.jar -jar AppliB.jar
    http://download.oracle.com/javase/1....dows/java.html

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    ne vous cassez pas la nenette. Tout ce qui est installé dans java home peut potentiellement altérer toute application java qui utilliserait cette jvm. Comme votre application B travaille comme un cochon, la solution la plus simple est de lui donnée sa propre jvm, faites simplement deux installation de java deux endroits différents. Appelez A avec la JVM 1, et B avec la jvm 2.

    D'autant plus que ce n'est pas nécessairement une classe de A qui serait cachée par B, la situation peut être bien plus complexe. -> isolez l'application fautive

    PS: on peux avoir le nom de l'application B? C'est pour ma galerie personelle des applications à ne pas utiliser :p

  4. #4
    Rédacteur/Modérateur
    Avatar de Logan Mauzaize
    Homme Profil pro
    Architecte technique
    Inscrit en
    Août 2005
    Messages
    2 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Transports

    Informations forums :
    Inscription : Août 2005
    Messages : 2 894
    Par défaut
    Citation Envoyé par verbose Voir le message
    Le problème vient certainement du fait que les applications A et B utilisent des versions différentes d'une même librairie.

    Si les librairies sont bien identifiées, voici la solution :

    Pour commencer, il est impossible d'empêcher le chargement des librairies déposées dans $JAVA_HOME/lib/ext.

    En revanche, on peut demander à la jvm de charger en priorité une autre librairie, ce qui a pour effet de surcharger les librairies système. A noter que, comme la documentation le précise, il est interdit de distribuer une application qui surcharge rt.jar qui contient l'api standard.

    Donc, il faut ajouter l'option -Xbootclasspath/p:path à la jvm.
    Solution envisageable mais : il faut tirer toutes les dépendances (y compris celles du System Class Loader)

    Citation Envoyé par verbose Voir le message
    Par exemple, si l'application A installe une librairie foo_1.jar dans $JAVA_HOME/lib/ext, et que cette librairie entre en conflit avec la librairie foo_2.jar située dans le CLASSPATH, il faut exécuter B avec la commande suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    java -Xbootclasspath/p:/path/to/foo_2.jar -jar AppliB.jar
    http://download.oracle.com/javase/1....dows/java.html
    Tu as inversé A et B ^_^
    Java : Cours et tutoriels - FAQ - Java SE 8 API - Programmation concurrente
    Ceylon : Installation - Concepts de base - Typage - Appels et arguments

    ECM = Exemple(reproduit le problème) Complet (code compilable) Minimal (ne postez pas votre application !)
    Une solution vous convient ? N'oubliez pas le tag
    Signature par pitipoisson

Discussions similaires

  1. Réponses: 8
    Dernier message: 28/02/2014, 10h52
  2. Rsync : log des fichiers présents uniquement dans la destination
    Par Ickou dans le forum Shell et commandes GNU
    Réponses: 0
    Dernier message: 28/07/2010, 14h05
  3. Lecteur des fichiers présents dans un champ blob
    Par qmike dans le forum Langage
    Réponses: 0
    Dernier message: 21/07/2010, 13h58
  4. [MFC] Ajout des fichiers récents dans un menu
    Par Choupinou dans le forum MFC
    Réponses: 3
    Dernier message: 20/08/2004, 16h47

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