Загрузка внешнего класса Java ClassDefNotFoundError - PullRequest
0 голосов
/ 30 мая 2018

Итак, для мода, который я пишу, у вас есть возможность запрограммировать свои собственные привилегии, которые будут использоваться вашим персонажем.Эти льготы компилируются и затем помещаются в папку, называемую «льготы».Я создал абстрактный класс, который должен быть расширен всеми этими внешними льготами, и он содержится в главном банке.

Абстрактный класс перков:

public abstract class Perk {

    public abstract void onCall( RCPlayer caller );

}

Пример перков:

public class ExamplePerk extends Perk {

    public void onCall( RCPlayer ) {
        // do something...
    }

}

Метод, который я использую для загрузки в эти внешние банки.Я удалил все пустые проверки и операторы try / catch, чтобы сохранить их в чистоте.

private static LoadStatus loadPerk( String path ) {
    URL url = new File( path ).toURI().toURL();

    URL[] urls = new URL[]{ url };
    YamlConfiguration perkYML = null;

    ClassLoader cl = new URLClassLoader( urls );
    Class<?> cls = Class.forName( main /* class path */, true, cl );
    clazz = cls.asSubclass( Perk.class );

    // Instantiate class & put into a data structure
    perks.put( new Descriptor( main, name, id, description ), clazz.newInstance() );
}

Полная ошибка: https://gyazo.com/e10acb615d88c50480a57118d54a3b17

Это вызывает ClassNoDefFoundError, потому что он не может найти"Перк" абстрактный класс.

Мой вопрос: как мне указать во время выполнения, где находится класс Perk?Во время компиляции я просто добавляю библиотеку, но когда приходит время использовать класс Perk в качестве расширения, программа проваливается и выдает эту ошибку.

Если я добавлю весь основной jar-файл в папку perks, онработает.Однако это плохая практика, так как мне пришлось бы включать все файлы проекта, и это было бы беспорядком.

Ответы [ 2 ]

0 голосов
/ 30 мая 2018

Попытка явно упомянуть родительский загрузчик классов для perks impls.ClassLoader cl = new URLClassLoader (urls, Perk.class.getClassLoader ());

Скорее всего, Perk.class не загружается загрузчиком классов ThreadContext.

0 голосов
/ 30 мая 2018

Это не работает, потому что он пытается создать экземпляр абстрактного класса, который невозможен.

Посмотрите эту ссылку - вам нужна ссылка на фактический подкласс.

https://www.tutorialspoint.com/java/lang/class_assubclass.htm

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...