Я пытаюсь создать банку, использую ее для компиляции, но не отправляю банку. Я ожидаю, что пользователь предоставит банку и направит мое приложение на эту банку.
Представьте себе следующее:
Это мое исходное дерево:
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
В чем моя ошибка? Как правильно это сделать?