2012-03-09 2 views
2

Est-il possible de décharger les bibliothèques standard Java - celles définies dans les paquets java. *?Comment décharger les bibliothèques standard Java

Mon application a besoin pour exécuter des tests JUnit, chacun avec son propre ClassLoader, comme ceci:

for(String testClass : testClasses) { 
    CustomClassLoader cl = new CustomClassLoader(this.getClass().getClassLoader()); 
    Class<?> _class = cl.loadClass(testClass); 
    JUnitCore junit = new JUnitCore(); 
    Result result = junit.run(_class); 
    registerResult(result, cl); 
} 

Le problème que j'ai est que certaines classes ne sont pas déchargés - Java * classes.. Si je ne les décharge pas, alors que se passe-t-il si les classes de test stockent des objets en utilisant des méthodes statiques, comme celles fournies par la classe java.security.Security, alors j'obtiens un ClassCastException.

Y a-t-il un moyen pour moi de forcer leur déchargement?

+0

Les classes java standard sont généralement chargées (une seule fois) par le classloader parent de votre CustomClassLoader. Donc, je ne comprends pas vraiment l'exigence de les décharger ... –

+0

@Andreas_D car il peut y avoir des valeurs globales statiques partagées entre les tests, comme les singletons. – aperez

Répondre

3

Il n'est pas possible de forcer le déchargement des classes. Tant qu'une classe ou une instance de la classe est référencée, elle ne sera pas collectée par gc. Vous devrez supprimer ces valeurs globales manuellement avant ou après chaque test.

Pour les tests unitaires, vous pouvez essayer d'exécuter chaque test dans un jvm récent. (ceci évitera les données de classe statiques mais n'évitera pas d'autres restes globaux comme des fichiers).

Ces liens peuvent aider:

Running each JUnit test in a separate JVM in Eclipse?

How to tell Maven2 to execute jUnit tests one by one each in new JVM instance?

0

Bien sûr, il n'y a pas moyen de décharger te classes système. Je pense qu'il vous manque quelque chose.

Questions connexes