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
A partir de ce moment, j'ai toutes les informations des 'paths' de mon organisation de fichiers.
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);
Je liste et teste les Jars, [DONE] signifie que le jar est testé et valide :
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 *** 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]
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
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. }
L'utilisateur a toujours la possibilité de copier les libraries dans lib/ext. mais :
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
* 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 :
Disons que j'aimerai que ceci soit dynamique.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 loader.findClass("com.mysql.jdbc.Driver");
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
Partager