【发布时间】:2018-05-29 21:28:04
【问题描述】:
因此,对于我正在编写的模组,您可以编写自己的特权以供您的角色使用。这些特权被编译,然后放入一个名为“perks”的文件夹中。我创建了一个抽象类,将通过所有这些外部特权进行扩展,并将其保存在主 jar 中。
Perk 抽象类:
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 文件夹,它确实有效。然而,这是一种不好的做法,因为我必须包含所有项目文件,这将是一团糟。
【问题讨论】:
标签: java jar external compile-time