Итак, для мода, который я пишу, у вас есть возможность запрограммировать свои собственные привилегии, которые будут использоваться вашим персонажем.Эти льготы компилируются и затем помещаются в папку, называемую «льготы».Я создал абстрактный класс, который должен быть расширен всеми этими внешними льготами, и он содержится в главном банке.
Абстрактный класс перков:
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, онработает.Однако это плохая практика, так как мне пришлось бы включать все файлы проекта, и это было бы беспорядком.