【问题标题】:Java External Class Loading ClassDefNotFoundErrorJava 外部类加载 ClassDefNotFoundError
【发布时间】: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


    【解决方案1】:

    这不起作用,因为它试图实例化一个不可能的抽象类。

    查看此链接 - 您需要对实际子类的引用。

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

    【讨论】:

    • 我明白你的意思,我现在已经按原样实例化了该类,并在实例化后使用了强制转换。这解决了第一个问题,但是我仍然无法获取该类,因为它会引发 NoClassDefFoundError。
    【解决方案2】:

    尝试明确提及 perks impls 的父类加载器。 ClassLoader cl = new URLClassLoader( urls, Perk.class.getClassLoader() );

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-11
      • 1970-01-01
      • 2021-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多