Java外部类加载ClassDefNotFoundError
所以,对于我正在写的mod,你有能力为你的角色编程你自己的特长。这些特权被编译后放入一个名为“特权”的文件夹中。我创建了一个抽象类,该类将通过所有这些外部额外功能进行扩展,并保存在主jar中 Perk抽象类:Java外部类加载ClassDefNotFoundError,java,jar,external,compile-time,Java,Jar,External,Compile Time,所以,对于我正在写的mod,你有能力为你的角色编程你自己的特长。这些特权被编译后放入一个名为“特权”的文件夹中。我创建了一个抽象类,该类将通过所有这些外部额外功能进行扩展,并保存在主jar中 Perk抽象类: public abstract class Perk { public abstract void onCall( RCPlayer caller ); } 示例特权: public class ExamplePerk extends Perk { public v
public abstract class Perk {
public abstract void onCall( RCPlayer caller );
}
示例特权:
public class ExamplePerk extends Perk {
public void onCall( RCPlayer ) {
// do something...
}
}
我用于在这些外部jar中加载的方法。
为了保持干净,我去掉了所有的空检查和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() );
}
私有静态LoadStatus loadPerk(字符串路径){
URL=新文件(路径).toURI().toURL();
URL[]URL=新URL[]{URL};
YamlConfiguration perkYML=null;
ClassLoader cl=新的URLClassLoader(URL);
Class cls=Class.forName(main/*类路径*/,true,cl);
clazz=cls.asSubclass(Perk.class);
//实例化类并将其放入数据结构中
put(新描述符(main、name、id、description)、clazz.newInstance());
}
完全错误:
因为找不到“Perk”抽象类,它抛出了一个classnodefeunderror
我的问题是,如何在运行时指定Perk类的位置?在编译时,我只是添加库,但当使用Perk类作为扩展时,程序会失败并抛出此错误
如果我将整个主jar添加到perks文件夹中,它就可以工作了。然而,这是一个糟糕的做法,因为我必须包含所有的项目文件&这将是一个混乱。这不起作用,因为它试图实例化一个抽象类,这是不可能的 请参阅此链接-您需要对实际子类的引用
这不起作用,因为它试图实例化一个不可能的抽象类 请参阅此链接-您需要对实际子类的引用
试图明确提及特权impls的父类加载器。 ClassLoader cl=新的URLClassLoader(URL,Perk.class.getClassLoader())
很可能Perk.class不是由ThreadContext类加载器加载的。尝试显式提及perks impls的父类加载器。 ClassLoader cl=新的URLClassLoader(URL,Perk.class.getClassLoader())
很可能Perk.class不是由ThreadContext类加载器加载的。我明白你的意思了,我现在已经按原样实例化了该类,并在实例化后使用强制转换。这修复了第一个问题,但是我仍然无法获取该类,因为它抛出了一个NoClassDefFoundError。我明白你的意思,我现在已经按原样实例化了该类,并在实例化后使用了一个cast。这修复了第一个问题,但是我仍然无法获取该类,因为它抛出了NoClassDefFoundError。