Чтение наследованного класса из стороннего jar вызывает NoClassDefFoundError

Версия Minecraft
1.12.2
API
Forge
Здравствуйте. У меня в моде есть абстрактный класс ChatProcessor. Также есть папка chatprocessors, в которой есть jar-файлы с классами, наследованными от ChatProcessor. Мод должен при определённых действиях (в моём случае - вводе специальной команды) подгрузить класс из jar-файла и создать экземпляр наследованного класса.
Для теста системы собрал специальный jar-ник с классом TestProc. Сборка была успешной. Также попытался тем же кодом создать экземпляр этого класса в отдельном проекте (не связанным с Minecraft, это возможно т.к. ChatProcessor не ссылается на него), всё работает прекрасно.
Но именно при запуске с Minecraft это заканчивается выбросом "java.lang.NoClassDefFoundError: com/scalpelred/chatcircuit/ChatProcessor". Причём этот класс существует: если сделать ChatProcessor неабстрактным и создать его экземпляр из самого мода, а потом вывести его в консоль, там будет "com.scalpelred.chatcircuit.ChatProcessor@2d9421". Как так может быть? (Репозиторий с модом)
 
Решение
Не знаю как там на 1.12 работает, но скорее всего тебе именно это нужно сделать.
Был у меня кусок кода, который делает подобное (загружает example.class), что с отдельными классами - что с jar-ками одно и то-же
Java:
public Class<?> load(Path path, String name){
    try {
        ModClassLoader loader = Loader.instance().getModClassLoader();
        //                      ^^ net.minecraftforge.fml.common.Loader
        loader.addFile(path.toFile());
        return loader.loadClass("exmob."+name);
    } catch (Exception e){
        throw new RuntimeException(e);
    }
}
Найди ClassLoader своего мода и загружай классы через него. Не знаю как там на 1.12 работает, но скорее всего тебе именно это нужно сделать.
А что за ClassLoader мода? Он уже существует, или это что-то, что надо создать самому?
UPD: более правильный вопрос: как это работает не на 1.12?
 
434
41
110
Не знаю как там на 1.12 работает, но скорее всего тебе именно это нужно сделать.
Был у меня кусок кода, который делает подобное (загружает example.class), что с отдельными классами - что с jar-ками одно и то-же
Java:
public Class<?> load(Path path, String name){
    try {
        ModClassLoader loader = Loader.instance().getModClassLoader();
        //                      ^^ net.minecraftforge.fml.common.Loader
        loader.addFile(path.toFile());
        return loader.loadClass("exmob."+name);
    } catch (Exception e){
        throw new RuntimeException(e);
    }
}
 
Сверху