Thread.currentThread (). SetContextClassLoader, кажется, не работает правильно - PullRequest
2 голосов
/ 05 августа 2011

Я пытаюсь создать банку, использую ее для компиляции, но не отправляю банку. Я ожидаю, что пользователь предоставит банку и направит мое приложение на эту банку.

Представьте себе следующее:

Это мое исходное дерево:

main
  Main.java
test
  Test.java

Я создаю две банки:

main.jar
  main
    Main.class
test.jar
  test
    Test.class

Мой источник выглядит так:

Main.java

package main;

import java.io.File;
import java.net.URL;
import java.net.URLClassLoader;

import test.Test;

public class Main {
    public static void main(String[] args) throws Exception {
        URLClassLoader urlClassLoader = new URLClassLoader(new URL[] { new File("test.jar").toURI().toURL() }, null);
        Thread.currentThread().setContextClassLoader(urlClassLoader);
        Test.test();
    }
}

Test.java

package test;

public class Test {
    public static void test() {
        System.out.println("Hello world!");
    }
}

Я вызываю main.jar , но без test.jar на пути к классам. Я ожидаю, что URLClassLoader загрузит test.jar и программу выведет Hello world! .

Но, похоже, я использую не URLClassLoader, а системный загрузчик классов. Я получаю:

Exception in thread "main" java.lang.NoClassDefFoundError: test/Test
    at main.Main.main(Main.java:14)
Caused by: java.lang.ClassNotFoundException: test.Test
    at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
    ... 1 more

В чем моя ошибка? Как правильно это сделать?

1 Ответ

0 голосов
/ 22 января 2015

Для тех, кто ищет ответ, посмотрите на Как изменить CLASSPATH в Java? для обходного пути и дополнительных объяснений

...