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 :

Chargement dynamique de Jar


Sujet :

Langage Java

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 4
    Points : 5
    Points
    5
    Par défaut Chargement dynamique de Jar
    Bonjour à tous !

    Je développe actuellement un méta modèle statistique.
    J'implèmente l'utilitaire en ligne de commande pour pouvoir utiliser le logiciel.
    J'aimerai charger des librairies de classes dynamiquement, je m'explique.
    Il y a la solution facile de mettre les jars dans le répertoire :
    "$JRE_HOME/lib/ext" où $JRE_HOME est le path vers la JRE.

    Comme il est parfois nécessaire d'avoir des droits d'administration pour pouvoir rajouter des jars là dedans, j'ai pensé à ceci :
    J'ai fait une architecture de fichiers de type 'unix' pour le logiciel :
    bin/ => les binaires (Classes) de l'application
    etc/ => les fichiers de configuration de l'application
    lib/ => les librairies 'jar' nécessaires au logiciel (celles que je veux charger)
    etc etc...

    Pour faciliter l'utilisation, au lancement en ligne de commande, je récupère le chemin de l'entrée qui est dans le répertoire 'bin' de l'application :
    Genostats_Writer.class avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    this.genoPath = this.getClass().getResource("").getPath().substring(0, 
    		this.getClass().getResource("").getPath().length() - 4);
    A partir de ce moment, j'ai toutes les informations des 'paths' de mon organisation de fichiers.

    Je liste et teste les Jars, [DONE] signifie que le jar est testé et valide :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    *** Loading libraries from : '/home/genostat/genostats/lib/'
            |=> Verify library : '/home/genostat/genostats/lib/log4j-1.2.15.jar'.[DONE]
            |=> Verify library : '/home/genostat/genostats/lib/xsltc.jar'.[DONE]
            |=> Verify library : '/home/genostat/genostats/lib/Shell.jar'.[DONE]
            |=> Verify library : '/home/genostat/genostats/lib/mysql-connector-java-5.1.5-bin.jar'.[DONE]
            |=> Verify library : '/home/genostat/genostats/lib/jfreechart-1.0.9.jar'.[DONE]
    Ensuite, j'appelle une méthode qui est faîte pour charger ces librairies :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    	/**
             * Add a list of jar files to the class path
             * @param libraries the list of jar files
             */
    	private void addLibraries(LinkedList<File> libraries) {
    		URL[] urls = new URL[libraries.size()]; 
    		Iterator<File> it = libraries.iterator();
    		for (int i = 0; i < libraries.size(); ++i) {
    			File f = it.next();
    			try {
    				urls[i] = f.toURI().toURL();
    			} catch (MalformedURLException e) { 
    				// already tested, may never occurs
    				System.err.println(
    					"Error > Malformed URL with file name : '" + urls[i]  + "'" +
    					"\nPlease see help.");
    				System.exit(1);
    			}
    		}
    		ClassLoader loader = new URLClassLoader(urls); 
    		// loader.
    	}
    Je suis bloqué ici et j'obtiens le message d'erreur logique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    *** Trying open SQL connection with file : '/home/genostat/genostats/etc/log.conf.xml'
    Error > SQL Error, Can't load JDBC library : 'com.mysql.jdbc.Driver', 
    Please see help or install JDBC for sql in '$JRE_HOME/lib/ext' or put jar in '/home/genostat/genostats/lib/'.
    /home/genostat/genostats/bin>java Genostats_Writer --view --db-test
    L'utilisateur a toujours la possibilité de copier les libraries dans lib/ext. mais :
    * J'aimerai autant qu'elles ne soient pas partagées.
    * Tout simplement, qu'il n'ait pas à le faire sauf si vraiment il y tient.

    Je pense avoir compris le système de fonctionnement pour charger les libraries , par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    loader.findClass("com.mysql.jdbc.Driver");
    Disons que j'aimerai que ceci soit dynamique.

    Alors voici les questions :
    1 - Suis je dans la bonne direction et, si oui, comment faire la suite ?
    2 - Une autre solution semble-t'elle plus adéquate ?
    3 - Est il possible de faire en sorte que ce système soit 'générique' ? Je sais que le serveur Tomcat fait ce genre de chose (et les autres serveurs J2EE aussi), peut être un script shell (ou .bat) qui fait ceci...
    4 - Est-ce qu'aller chercher les manifestes et autres fichiers dans le jar peut m'aider et comment ?
    5 - Est-ce qu'une fois le point d'entrée établi les autres classes du jar vont être aussi chargées ?

    Je pense avoir fait le tour des questions. je suis ouvert à toutes solutions.

    Merci

  2. #2
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    Dans deux de mes logiciels, j'ai fait quelque chose de similaire. Il te suffit de construire ton propre ClassLoader et de redéfinir la recherche de classes dans les jars de ton répertoire si le ClassLoader initial ne trouve rien.
    C'est d'ailleurs la solution utilisée par Tomcat, entre autre.

Discussions similaires

  1. Chargement dynamique d'une bibliothèque (.jar)
    Par Franquie dans le forum Android
    Réponses: 0
    Dernier message: 06/08/2014, 19h11
  2. Chargement dynamiquement Jar JDBC
    Par matla dans le forum JDBC
    Réponses: 6
    Dernier message: 14/11/2008, 14h55
  3. chargement dynamique d'un autre jar
    Par Serik dans le forum Applets
    Réponses: 2
    Dernier message: 19/07/2007, 22h10
  4. Chargement dynamique d'une archive.jar
    Par cfrayer dans le forum Langage
    Réponses: 5
    Dernier message: 29/08/2006, 16h00
  5. [jar]chargement dynamique.
    Par Teddy-htk dans le forum API standards et tierces
    Réponses: 10
    Dernier message: 27/04/2006, 15h19

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