2017-08-08 7 views
0

Quand je lance un test qui utilise org.eclipse.equinox.common 3.6 avec Java 6 dans Eclipse Neon, je parfois l'erreur suivante:Comment exécuter un test JUnit dans Eclipse qui utilise une ancienne version de org.eclipse.equinox.common?

java.lang.UnsupportedClassVersionError: org/eclipse/core/runtime/IAdapterManager : Unsupported major.minor version 51.0 
    at java.lang.ClassLoader.defineClass1(Native Method) 
    at java.lang.ClassLoader.defineClassCond(ClassLoader.java:631) 
    at java.lang.ClassLoader.defineClass(ClassLoader.java:615) 
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141) 
    ... 

Il semble que les charges de coureur de test deux versions différentes de org .eclipse.equinox.common. Quand j'inspecter les propriétés du processus dans la vue de débogage, je vois (entre autres) les classpath entrées

C:\workspace\.metadata\.plugins\org.eclipse.pde.core\.bundle_pool\plugins\org.eclipse.equinox.common_3.8.0.v20160509-1230.jar 
C:\Users\me\.m2\repository\org\eclipse\org.eclipse.equinox.common\3.6.0.v20110523\org.eclipse.equinox.common-3.6.0.v20110523.jar 

Version 3.8 nécessite Java 7, donc je voudrais forcer le test à choisir la version 3.6. Comment puis-je atteindre cet objectif?

Répondre

0

J'ai trouvé un bidouille mal classloader qui résout le problème, sur la base this answer:

@BeforeClass 
public static void setUpClass() throws Exception { 
    removeJarFromClasspath("org.eclipse.equinox.common_3.8"); 
} 

public static void removeJarFromClasspath(String namePart) throws Exception { 
    URLClassLoader urlClassLoader = (URLClassLoader)ClassLoader.getSystemClassLoader(); 
    Field ucpField = URLClassLoader.class.getDeclaredField("ucp"); 
    ucpField.setAccessible(true); 
    URLClassPath ucp = (URLClassPath)ucpField.get(urlClassLoader); 

    Field pathField = URLClassPath.class.getDeclaredField("path"); 
    pathField.setAccessible(true); 
    List path = (List)pathField.get(ucp); 

    Field loadersField = URLClassPath.class.getDeclaredField("loaders"); 
    loadersField.setAccessible(true); 
    List loaders = (List)loadersField.get(ucp); 

    Field lmapField = URLClassPath.class.getDeclaredField("lmap"); 
    lmapField.setAccessible(true); 
    Map lmap = (Map)lmapField.get(ucp); 

    int index = 0; 
    for (Object entry : path) { 
     String url = entry.toString(); 
     if (url.contains(namePart)) { 
      path.remove(index); 
      loaders.remove(index); 
      lmap.remove(url.replaceFirst("file:/", "file:///")); 
      break; 
     } 
     index++; 
    } 
}