无法从dir加载类。使用罐子,当罐子解压缩/解压缩时可以加载类

时间:2011-09-20 06:08:16

标签: classloader urlclassloader dynamic-class-loaders

社会!如果你能帮我解决我的问题会很棒。

我有一个自定义类加载器,它将成为java.system.class.loader - 它成立 url在哪里找到课程。像这样:

public class TestSystemClassLoader extends URLClassLoader {

    public TestSystemClassLoader(ClassLoader parent) {
    super(classpath(), parent);
    }

    private static URL[] classpath() {
    try {
        // I got junit-4.8.2.jar under this url.
        URL url = new File("D:\\Work\\lib\\junit-4\\").toURI().toURL();
        return new URL[] { url };
    }
    catch (MalformedURLException e) {
        throw new IllegalArgumentException(e);
    }
    }
}

然后我用-Djava.system.class.loader = TestSystemClassLoader eg.TestMain运行java(JDK6), 其中eg.TestMain'main:

public static void main(String[] args) throws Exception {
    // here I got system CL which is what I want.
ClassLoader cl = Thread.currentThread().getContextClassLoader();
    // here I got: "Exception in thread "main" java.lang.ClassNotFoundException: org.junit.runners.JUnit4"
Class<?> clazz = Class.forName("org.junit.runners.JUnit4", true, cl);
}

令我生气的是,如果我解压缩/解压缩/解开junit-4.8.2.jar - 那么 eg.TestMain会起作用!

问题是 - 如何告诉java(JDK6)我希望整个目录在classpath中, 即任何驻留在目录中的文件。

提前致谢!

1 个答案:

答案 0 :(得分:0)

找到所有的罐子并添加它们:

private static URL[] classpath() {
    try {
        File file = new File("D:\\Work\\lib\\junit-4\\");
        List<URL> urls = new ArrayList<URL>();
        for (File f : file.listFiles()) {
            if (f.isFile() && f.getName().endsWith(".jar")) {
                urls.add(f.toURI().toURL());
            }
        }

        return urls.toArray(new URL[0]);
    }
    catch (MalformedURLException e) {
        throw new IllegalArgumentException(e);
    }
}