2013-07-28 2 views
0

Heyho,Les différentes versions d'une bibliothèque chargée à la même ClassLoader

Disons que nous avons cette configuration:

application ->plug-in ->Module

Où « plug-in "et" module "dépendent de" l'application ".

L'application utilise la version 1.0 d'une bibliothèque. Le module dépend de la même bibliothèque, mais de la version 2.0. Les classes sont les mêmes, mais certaines méthodes sont supprimées dans la version 2.0 et quelques-unes sont ajoutées. plugin utilise le chargeur de classe parent de demande et Module le ClassLoader parent de plug-in.

Maintenant, le problème est que le module utilise la version 1.0 de la bibliothèque, mais cela dépend de 2.0 ->par exemple la méthode non trouvée

Quelle serait la façon propper pour résoudre ce problème? Quelque chose qui fonctionnerait est de déplacer la version 2.0, mais il y a peut-être une solution de contournement pendant l'exécution. Peut-être qu'il est possible de changer les classloaders pour résoudre le problème.

Max

+0

Vous devrez corriger vos dépendances. Il n'y a aucun moyen de résoudre ce problème. Considérons que vous chargez une version de 'Class' à partir de la version 1.0 dans Application et que vous la transmettez à une autre' Class' dans le plugin, que se passe-t-il alors? –

+0

@BoristheSpider ouais sauf ombrage/relocalisation: P – maxammann

Répondre

1

Vos options sont:

  1. mise à niveau de l'application à 2,0
  2. downgrade le plug-in à 1,0 (et espérons que cela fonctionne encore)
  3. déplacer l'application "noyau" en classloader imbriqué
  4. modifiez les classloaders plugin/module afin qu'ils ne soient pas "parent d'abord". Notez que c'est une option très sommaire qui peut vraiment gâcher les choses si elle n'est pas faite correctement.

Option 3. ressemblerait à ceci:

Application Base -> plugin -> module (lib 2.0) 
       -> Application Core (lib 1.0) 

Cela rend essentiellement le plug-in et les pairs de base de l'application et donc il n'y a plus un problème de classloader.

+0

Je ne suis pas exactement sûr de ce que vous voulez dire avec votre 3. option. Autant que je puisse voir le module 1.0 et le module 2.0 utilisent toujours le classloader de la base d'application en tant que parent. – maxammann

+0

Et que voulez-vous dire par base d'application et noyau? N'est-ce pas la même chose? – maxammann

+0

@ p000ison - oui, mais comme le module n'est pas disponible dans le chargeur de classe de base, il sera chargé par les chargeurs de classe enfants. En ce qui concerne la base de calcul et le noyau, non, je dis que vous devez diviser l'application en deux chargeurs de classes distincts. le classloader de base a les "classes bootstrap" et toute classe "api" nécessaire au plugin. le classloader de l'application core a toutes les classes "implementation" que plugin/module n'a pas besoin d'utiliser directement.Notez que cela n'affecte pas le chargement du plugin/module, il déplace simplement beaucoup de classes d'application dans un chargeur de classe séparé. – jtahlborn

Questions connexes