如何在使用旧版本 org.eclipse.equinox.common 的 Eclipse 中 运行 JUnit 测试?

How to run a JUnit test in Eclipse that uses an older version of org.eclipse.equinox.common?

当我 运行 在 Eclipse Neon 中使用 org.eclipse.equinox.common 3.6 和 Java 6 的测试时,有时会出现以下错误:

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

似乎测试 运行ner 加载了两个不同版本的 org.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.6.0.v20110523\org.eclipse.equinox.common-3.6.0.v20110523.jar

3.8版需要Java7,所以我想强制测试选择3.6版。我怎样才能做到这一点?

我找到了一个解决问题的邪恶类加载器 hack,基于 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++;
    }
}