Хорошо, в основном, я пытаюсь использовать метод, описанный здесь JarFileLoader , чтобы загрузить банку, содержащую класс, который будет использоваться так же, как если бы он был в пути к классам (имя класса будет динамическим, поэтому что мы можем просто добавить любой jar-файл с любым классом, и программа загрузит его посредством анализа текстового файла в основной строке).
Проблема в том, что когда я отлаживаю и проверяю объект URLClassLoader
protected Class<?> findClass(final String name)
Линия:
Resource res = ucp.getResource(path, false);
getResource () не находит имя класса в параметре.
Кто-то уже пытался загрузить файл JAR таким образом?
Спасибо.
Загрузчик:
public class JarFileLoader extends URLClassLoader {
public JarFileLoader() {
super(new URL[] {});
}
public JarFileLoader withFile(String jarFile) {
return withFile(new File(jarFile));
}
public JarFileLoader withFile(File jarFile) {
try {
if (jarFile.exists())
addURL(new URL("file://" + jarFile.getAbsolutePath() + "!/"));
} catch (MalformedURLException e) {
throw new IllegalArgumentException(e);
}
return this;
}
public JarFileLoader withLibDir(String path) {
Stream.of(new File(path).listFiles(f -> f.getName().endsWith(".jar"))).forEach(this::withFile);
return this;
}
}
Основной:
public static void main(String[] args) {
new Initializer();
JarFileLoader cl = new JarFileLoader();
cl = cl.withFile(new File("libs/dpr-common.jar"));
try {
cl.loadClass("com.*****.atm.dpr.common.util.DPRConfigurationLoader");
System.out.println("Success!");
} catch (ClassNotFoundException e) {
System.out.println("Failed.");
e.printStackTrace();
} finally {
try {
cl.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
Здесь тестовый класс, который я использовал. Когда я отлаживаю URLClassLoader, я вижу в третьем цикле путь к файлу jar (цикл на пути к классам и URL, который вы добавляете здесь), но все еще не находит ресурс (и не может отлаживать класс URLClassPath, поэтому не знаете, что делает getRessource точно).