Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java外部类加载ClassDefNotFoundError_Java_Jar_External_Compile Time - Fatal编程技术网

Java外部类加载ClassDefNotFoundError

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

所以,对于我正在写的mod,你有能力为你的角色编程你自己的特长。这些特权被编译后放入一个名为“特权”的文件夹中。我创建了一个抽象类,该类将通过所有这些外部额外功能进行扩展,并保存在主jar中

Perk抽象类:

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。