2017-08-08 143 views
0

当我运行org.eclipse.equinox.common 3.6和Java 6在Eclipse中使用霓虹灯的测试,我有时会收到以下错误:如何在Eclipse中使用org.eclipse.equinox.common的旧版本运行JUnit测试?

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

看来,测试运行加载两个不同版本的组织.eclipse.equinox.common。当我在调试视图检查过程中的特性,我看到(等等)的类路径条目

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 

版本3.8需要Java 7,所以我想迫使测试选择3.6版本。我怎样才能做到这一点?

回答

0

我找到了一个邪恶的类加载器的黑客是解决问题的基础上,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++; 
    } 
} 
相关问题