Java External Class Loading ClassDefNotFoundError



所以对于我正在编写的mod,你可以编程自己的特权,供你的角色使用。这些特权被编译,然后放入一个名为"特权"的文件夹中。我创建了一个抽象类,它将被所有这些外部特权扩展,它保存在主jar中。

特权抽象类:

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 类的位置?在编译时,我只是添加库,但是当需要使用 Perk 类作为扩展时,程序会失败并抛出此错误。

如果我将整个主jar添加到perks文件夹中,它确实有效。然而,这是不好的做法,因为我必须包括所有项目文件,这将是一团糟。

这是行不通的,因为它试图实例化一个抽象类,这是不可能的。

请参阅此链接 - 您需要对实际子类的引用。

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

尝试明确提及父类加载器以获得特权 impls。 ClassLoader cl = new URLClassLoader( urls, Perk.class.getClassLoader(( (;

最有可能的是 Perk.class 不是由 ThreadContext 类加载器加载的。

相关内容

  • 没有找到相关文章

最新更新