2017-08-08 3 views
0

Wenn ich einen Test ausführen, die org.eclipse.equinox.common 3.6 mit Java 6 in Eclipse Neon verwendet, ich folgende Fehlermeldung manchmal erhalten:Wie wird ein JUnit-Test in Eclipse ausgeführt, der eine ältere Version von org.eclipse.equinox.common verwendet?

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) 
    ... 

Es scheint, dass die Testläufer Lasten zwei verschiedene Versionen von org .eclipse.equinox.common Wenn ich die Prozesseigenschaften in der Debug-Ansicht überprüfen, sehe ich (unter anderem) die Classpath-Einträge

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 erfordert Java 7, so würde Ich mag den Test zu zwingen, Version 3.6 zu wählen. Wie kann ich das erreichen?

Antwort

0

fand ich einen bösen Klassenlader Hack, der das Problem, basierend auf this answer löst:

@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++; 
    } 
} 
Verwandte Themen