OVH Cloud OVH Cloud

Changement de classpath

3 réponses
Avatar
Emmanuel PIC
Je chercherais à mettre à jour le classpath au runtime.
En effet, je charge des classes contenues dans des jars externes au
runtime. Le problème est que ces classes cherchent à charger des
ressources qui ne sont pas dans le classpath (icones ou autres). Par
conséquent, les getResource() ou autre Toolkit.getImage() ne marchent pas.

Pour le moment, avant de charger ces classes, j'ajoute au classpath
l'emplacement de ces jars au runtime, mais ca n'a aucun effet (comme,
malheureusement prévu) :

String jarPath = pluginDir.getPath() + File.separator + jar;
String classPath = System.getProperty("java.class.path");
System.setProperty("java.class.path", classPath.concat(PATH_SEPARATOR +
jarPath));
System.out.println(classPath + PATH_SEPARATOR + jarPath);
//...
//Chargement de la classe

Mais après ce code, les changements de classpath ne sont pas pris en
compte, et les ressources externes ne peuvent donc pas être chargées...

Merci de votre aide

3 réponses

Avatar
Christophe M.
Je crois que dans ce cas là, tu vas devoir ecrire ton propre
classloader. Celui du runtime étant instancié au démarrage, le
changement ultérieur de la propriété système CLASSPATH n'aura pas
d'effet sur lui (éventuellement sur d'autre programme lancé par
Runtime.exec()...)
Va donc falloir dériver le classloader pour tenir compte des "nouveaux"
chemins que tu veux ajouter en dynamique...


Emmanuel PIC wrote:
Je chercherais à mettre à jour le classpath au runtime.
En effet, je charge des classes contenues dans des jars externes au
runtime. Le problème est que ces classes cherchent à charger des
ressources qui ne sont pas dans le classpath (icones ou autres). Par
conséquent, les getResource() ou autre Toolkit.getImage() ne marchent pas.

Pour le moment, avant de charger ces classes, j'ajoute au classpath
l'emplacement de ces jars au runtime, mais ca n'a aucun effet (comme,
malheureusement prévu) :

String jarPath = pluginDir.getPath() + File.separator + jar;
String classPath = System.getProperty("java.class.path");
System.setProperty("java.class.path", classPath.concat(PATH_SEPARATOR +
jarPath));
System.out.println(classPath + PATH_SEPARATOR + jarPath);
//...
//Chargement de la classe

Mais après ce code, les changements de classpath ne sont pas pris en
compte, et les ressources externes ne peuvent donc pas être chargées...

Merci de votre aide



Avatar
Emmanuel PIC
A vrai dire, je me suis déjà inspiré de son code ;)
Je cherche une solution annexe en fait :/ Je crois que je vais
apppliquer le doux principe du RTFM... :)

Christophe M. wrote:

Désolé, j'en sais pas plus que toi :-p
Une bonne lecture : le code source de Jext (excellent éditeur) qui
utilise cet "artifice" pour charger ses plugins. Tu devrais y trouver ce
que tu veux ;-)

www.jext.org évidemment

Emmanuel PIC wrote:

Arf... Je ne suis pas vraiment expert en ClassLoader :/

Comment spécifier l'utilisation d'un ClassLoader personnel plutôt que
du ClassLoader système? S'agit-il d'un paramètre à passer au démarrage
de l'application?

Christophe M. wrote:

Je crois que dans ce cas là, tu vas devoir ecrire ton propre
classloader. Celui du runtime étant instancié au démarrage, le
changement ultérieur de la propriété système CLASSPATH n'aura pas
d'effet sur lui (éventuellement sur d'autre programme lancé par
Runtime.exec()...)
Va donc falloir dériver le classloader pour tenir compte des
"nouveaux" chemins que tu veux ajouter en dynamique...


Emmanuel PIC wrote:

Je chercherais à mettre à jour le classpath au runtime.
En effet, je charge des classes contenues dans des jars externes au
runtime. Le problème est que ces classes cherchent à charger des
ressources qui ne sont pas dans le classpath (icones ou autres). Par
conséquent, les getResource() ou autre Toolkit.getImage() ne
marchent pas.

Pour le moment, avant de charger ces classes, j'ajoute au classpath
l'emplacement de ces jars au runtime, mais ca n'a aucun effet
(comme, malheureusement prévu) :

String jarPath = pluginDir.getPath() + File.separator + jar;
String classPath = System.getProperty("java.class.path");
System.setProperty("java.class.path",
classPath.concat(PATH_SEPARATOR + jarPath));
System.out.println(classPath + PATH_SEPARATOR + jarPath);
//...
//Chargement de la classe

Mais après ce code, les changements de classpath ne sont pas pris en
compte, et les ressources externes ne peuvent donc pas être chargées...

Merci de votre aide












Avatar
Christophe M.
Désolé, j'en sais pas plus que toi :-p
Une bonne lecture : le code source de Jext (excellent éditeur) qui
utilise cet "artifice" pour charger ses plugins. Tu devrais y trouver ce
que tu veux ;-)

www.jext.org évidemment

Emmanuel PIC wrote:

Arf... Je ne suis pas vraiment expert en ClassLoader :/

Comment spécifier l'utilisation d'un ClassLoader personnel plutôt que du
ClassLoader système? S'agit-il d'un paramètre à passer au démarrage de
l'application?

Christophe M. wrote:

Je crois que dans ce cas là, tu vas devoir ecrire ton propre
classloader. Celui du runtime étant instancié au démarrage, le
changement ultérieur de la propriété système CLASSPATH n'aura pas
d'effet sur lui (éventuellement sur d'autre programme lancé par
Runtime.exec()...)
Va donc falloir dériver le classloader pour tenir compte des
"nouveaux" chemins que tu veux ajouter en dynamique...


Emmanuel PIC wrote:

Je chercherais à mettre à jour le classpath au runtime.
En effet, je charge des classes contenues dans des jars externes au
runtime. Le problème est que ces classes cherchent à charger des
ressources qui ne sont pas dans le classpath (icones ou autres). Par
conséquent, les getResource() ou autre Toolkit.getImage() ne marchent
pas.

Pour le moment, avant de charger ces classes, j'ajoute au classpath
l'emplacement de ces jars au runtime, mais ca n'a aucun effet (comme,
malheureusement prévu) :

String jarPath = pluginDir.getPath() + File.separator + jar;
String classPath = System.getProperty("java.class.path");
System.setProperty("java.class.path", classPath.concat(PATH_SEPARATOR
+ jarPath));
System.out.println(classPath + PATH_SEPARATOR + jarPath);
//...
//Chargement de la classe

Mais après ce code, les changements de classpath ne sont pas pris en
compte, et les ressources externes ne peuvent donc pas être chargées...

Merci de votre aide