Bonjour tout le monde,
Je cherche à savoir comment la JVM charge les classes d'un jar en dépendance d'un autre.
Je sais que le fichier MANIFEST y est pour beaucoup avec son attribut Class-Path mais j'aimerai en faire de même.
J'expose mon problème:
Pour un projet sur lequel je travail, je dois réaliser un mécanisme de plugin.
Depuis mon programme principale, lorsque celui démarre je vais scruter un répertoir dans lequel sont censés être mes plugins sous forme de Jars.
Ensuite pour chacun de ces Jars, je lis un fichier XML (inclus dans le Jar) pour savoir quelle est la classe principale que je dois charger. Jusque là tout va bien, car ce n'est pas compliqué.
Là où ça se complique c'est que si dans le fichier MANIFEST, s'il y a l'attribut Class-Path alors cela signifie que le plugin que je cherche à charger dépend d'autre Jar inclus dans ce même Jar. Voici un exemple d'arborescence possible :
La solution que j'ai actuellement consiste à copier dependance1.jar et dependance2.jar dans un répertoire temporaire et à réiterer le processus tant que les dépendances en possèdent elles-mêmes. Et une fois les dépendances chargées (je liste tous les .class des jars et je les charge avec un URLClassLoader), je charge la classe principale de mon plugin.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13monPlugin.jar ------ + --- monPackage | | | + main.class | + ... | + --- META-INF | | | + --- MANIFEST.MF + --- lib | + dependance1.jar + dependance2.jar
Bon, d'une part je trouve ça moyen car je ne pense pas que la JVM décompresse les jars pour en extraire les dépendances pour ensuite les charger, et d'autre part il se peut que dans les dépendances, l'attibut "Sealed" du manifest soit à "true" dans quel cas je ne peut charger les classes de cette dépendance.
Donc si vous avez une solution à mon problème je suis preneur.
Ah oui j'allais oublié: lorsque je lance mon porgramme principale, je ne veux pas mettre les jars des plugins sur la ligne de commande pour les ajouter au classpath (je vous voyais venir bande de petits malins ...).
Si vous avez des questions, j'y répondrais pour vous éclaircir sur mon problème.
Merci
Partager