URLClassLoader не может найти классы

Я хочу использовать URLClassLoader для загрузки классов в определенный каталог из jar-архива.

Структура проекта следующая

/
 application.jar
 /lib/
  mysql.jar
  log4j.jar
  ...
 /myClasses/
  class1.class
  class2.class
  ...

Баночка имеет следующий манифест:

Manifest-Version: 1.0
Ant-Version: Apache Ant 1.8.3
Created-By: 1.7.0_07-b10 (Oracle Corporation)
Main-Class: de.application.start
Class-Path: lib/mysql.jar lib/log4j.jar lib/....jar

В настоящее время я перебираю все файлы в /myClasses/ и пытаюсь загрузить этот конкретный класс (все они имеют один и тот же пакет) следующим образом:

File classDir = new File("/path/to/my/root/folder/myClasses/");
URL[] url = { classdir.toURI().toURL() };
ClassLoader loader = new URLClassLoader(url);
for (File file : classDir.listFiles()) {
    String filename = StringUtil.getFilenameWithoutExtension(file.getName());
    loader.loadClass("de.myClasses." + filename).getConstructor().newInstance();

Но, несмотря на то, что файлы явно существуют, я всегда получаю ошибку java.lang.ClassNotFoundException: de.myClasses.class1. Что я делаю не так?


person F.P    schedule 12.09.2012    source источник
comment
Вы пишете, что хотите загрузить классы из jar-архива, но в своем коде вы указываете необработанный каталог (/path/to/my/root/folder/myClasses/) в качестве параметра для URLClassLoader. Вы должны указать файл jar здесь.   -  person korifey    schedule 12.09.2012
comment
Да, это правильно. Мое приложение находится в архиве jar, и из этого архива я хочу загрузить другие классы в каталог.   -  person F.P    schedule 12.09.2012
comment
Ваша цель - получить доступ к классу, который хранится в банке, хранящейся в банке? Это не работает, и я уверен, что поиск выдаст множество сообщений, в которых рассказывается, почему и как это обойти.   -  person parsifal    schedule 12.09.2012


Ответы (2)


Вы должны поместить свои скомпилированные классы в каталоги в соответствии с их пакетами. Итак, класс de.myClasses.Class1 должен находиться в каталоге /myClasses/de/myClasses/.

person michael    schedule 12.09.2012

file.getName() возвращает "Class1.class" вместо "Class1", верно? удалить последние 6 символов.

Кроме того, если Class1 находится в пакете de.myClasses, он должен быть в

<your_base_dir>/de/myClasses

и если Class1 находится в верхнем пакете (без пакета), вы должны запросить его как

loader.loadClass("Class1") // no de.mClasses. prefix
person helios    schedule 12.09.2012
comment
Нет, я сделал это в своем приложении. Я написал это здесь так, чтобы сэкономить место, я изменю это. - person F.P; 12.09.2012