Не могу загрузить классы из каталога. с jars, а может выполнять загрузку классов, когда jar разархивирован / распакован - PullRequest
0 голосов
/ 20 сентября 2011

сообщество!Было бы здорово, если бы вы могли помочь мне с моей проблемой.

Я получил специальный загрузчик классов, который будет 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);
    }
    }
}

Затем я запускаю java (JDK6) с -Djava.system.class.loader = TestSystemClassLoader eg.TestMain, где 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, то, например, будет работать TestMain!

Вопрос в том, как сказать java (JDK6), что я хочу, чтобы весь каталог находился в classpath, т.е. любой файл, находящийся в каталоге.

Заранее спасибо!

1 Ответ

0 голосов
/ 02 октября 2011

Найдите все банки и добавьте их:

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