2014-05-01 1 views
0

Je rencontre le problème discuté here qui conduit à une erreur java.lang.ClassNotFoundException: __redirected/__DatatypeFactory. Jason Greene dit dans le fil ci-dessus: «... assurez-vous que vous avez défini TCCL pour pointer vers le classloader de votre module (et le réinitialiser à l'original dans le bloc finally)». Je voudrais essayer ceci mais ne peux pas comprendre comment placer le TCCL ou obtenir le classloader de module. Comment est-ce que je peux placer le TCCL au classloader de module?Définition du TCCL dans WildFly/JBoss

Informations complémentaires:

  • je rencontre l'erreur lors du débranchement XML avec JAXB
  • J'utilise wildfly 8.0.0.CR1

Répondre

1

La réponse a fini par être étonnamment simple (pour mon contexte!) J'avais une classe qui avait le bon contexte TCCL dedans.

Ce serait la classe qui a le chargeur correct quand il est initialisé

public class GoodClass { 

    private ClassLoader goldenLoader; 

    public GoodClass() { 
     // the class loader must be the 'correct' one at this point. We save the 'correct' one for later 
     this.goldenLoader = Thread.currentThread().getContextClassLoader(); 
    } 

    public static ClassLoader getGoodClassLoader() { 
     return goldenLoader; 
    } 
} 

Ce serait la classe qui a le TCCL et __redirected/__ problèmes DatatypeFactory

public class BadClass { 
    public void myMethod() { 

     ClassLoader origLoader = Thread.currentThread().getContextClassLoader(); 

     try { 
      // you can NOT do stuff that relies on the set TCCL here 
      ClassLoader goldenLoader = GoodClass.getGoodClassClassLoader().getGoldenLoader(); 
      Thread.currentThread().setContextClassLoader(goldenLoader); 
      // you CAN do stuff that relies on the set TCCL here 
     } finally { 
      // use this if you need to restore the orignal loader 
      Thread.currentThread().setContextClassLoader(origLoader); 
     } 
    } 
} 
+1

reseting chargeur de classe besoins à faire dans un bloc final. –

+0

Bon appel @ JamesR.Perkins. Mis à jour selon votre suggestion. Est-il impératif de TOUJOURS inverser le classloader ou est-ce seulement nécessaire si votre swappé dans classloader ne fait pas tout ce que fait l'original? – chessofnerd

+1

Oui, il est absolument impératif de toujours revenir à la TCCL même si elle est nulle. Vous ne savez jamais quels autres composants/dépendances vont essayer de faire la même chose. –