Java - comment charger les différentes versions de la même classe?
J'ai lu beaucoup de choses sur Java chargeurs de classes, mais jusqu'à présent, je n'ai pas réussi à trouver une réponse à cette simple question:
J'ai deux versions de com.abc.Hello.class dans des bocaux v1.jar et v2.jar. Je veux utiliser les deux dans mon application. Quelle est la façon la plus simple de faire cela ?
Je ne m'attends pas à être aussi simple que cela, mais quelque chose le long de ces lignes serait génial :
Classloader myClassLoader = [magic that includes v1.jar and ignores v2.jar]
Hello hello = myclassLoader.load[com.abc.Hello]
Et dans une classe différente :
Classloader myClassLoader = [magic that includes v2.jar and ignores v1.jar]
Hello hello = myclassLoader.load[com.abc.Hello]
Je voudrais éviter d'utiliser OSGi.
- Personnellement, je ne pense pas que je voudrais une telle magie car elle conduirait à une opération de maintenance/dépannage cauchemar... pourriez-vous expliquer pourquoi vous avez besoin de cela?
- Plusieurs plugins qui dépendent de différentes versions de la même bibliothèque partagée serait une raison pour cela.
Vous devez vous connecter pour publier un commentaire.
Vous êtes dans la bonne voie. Vous devez prendre certaines choses en considération.
La chose normale est des classes qui existent dans les chargeurs de classes parent sont utilisés. Donc, si vous voulez deux versions de ces classes ne doit pas être là.
Mais si vous souhaitez interagir vous pouvez utiliser la réflexion, ou encore mieux une interface commune. Donc je vais le faire:
c1.someMethod()
?Vous avez presque écrit la solution.
J'espère que le fragment de code suivant vous aidera.
Remplacer
v1.jar
parv2.jar
et ce code permet de charger la version #2.cela dépend de ce que sont u va faire avec les deux versions et le comment, mais en général, vous pouvez au moins de la charge 2 version de classe dans les différents chargeurs de classes, puis définissez la Fil.contextClassloader() et jouer...
voir http://www.javaworld.com/javaqa/2003-06/01-qa-0606-load.html et http://docs.oracle.com/javase/jndi/tutorial/beyond/misc/classloader.html
Pour un exemple de mise en œuvre de la accepté de répondre par @helios caisse github.com/atulsm/ElasticsearchClassLoader