NoClassDefFoundError错误。为什么???我该如何解决?

时间:2016-10-08 15:59:34

标签: java classloader

我写了我的类加载器:

package ru.sberbank.school.homework8;

import ru.sberbank.school.homework8.plugin.Plugin;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

public class PluginManager extends ClassLoader {
private final String pluginRootDirectory;

public PluginManager(String pluginRootDirectory) {
    this.pluginRootDirectory = pluginRootDirectory;
}

public Plugin load(String pluginName, String pluginClassName) {
    String name = pluginName + "." + pluginClassName;
    try {
        Class clazz;
        try {
            clazz = super.findSystemClass(name);
        } catch (ClassNotFoundException e) {
            String fileName = pluginRootDirectory + "\\" + pluginName + "\\" + pluginClassName + ".class";
            try (FileInputStream fin = new FileInputStream(fileName)) {
                byte[] buffer = new byte[(int) (new File(fileName).length())];
                fin.read(buffer);
                clazz = defineClass(name, buffer, 0, buffer.length);
            }
        }
        return (Plugin)clazz.newInstance();

    } catch (IOException | InstantiationException | IllegalAccessException ignored) {
        return null;
    }
}

}

当我运行它时:

package ru.sberbank.school.homework8;

import ru.sberbank.school.homework8.plugin.Plugin;

public class PluginManagerTest {
    public static void main(String[] args) {
        String pluginRootDirectory = "D:\\sbt\\target\\classes\\ru\\sberbank\\school\\homework8";
        PluginManager pluginManager = new PluginManager(pluginRootDirectory);
        Plugin plugin = pluginManager.load("plugin", "PluginImpl");
        if (plugin != null) {
            plugin.doUseful();
        }
    }
}
  

线程中的异常" main" java.lang.NoClassDefFoundError:   plugin / PluginImpl(错误的名字:   ru / sberbank / school / homework8 / plugin / PluginImpl)at   java.lang.ClassLoader.defineClass1(本机方法)

我得到NoClassDefFoundError。为什么???我该如何解决?

请帮帮我!

package ru.sberbank.school.homework8.plugin;

public class PluginImpl implements Plugin {
    @Override
    public void doUseful() {
        System.out.println("My plugin!");
    }
}

1 个答案:

答案 0 :(得分:0)

您收到此错误是因为您没有提供类的正确FQN,实际上在您的load方法中,您尝试找到与pluginName + "." + pluginClassName对应的类,这将在您的情况下{ {1}}但您的班级plugin.PluginImpl的套餐名称实际为PluginImpl,因此您班级的真实FQN为ru.sberbank.school.homework8.plugin

要解决此问题,您需要替换:

ru.sberbank.school.homework8.plugin.PluginImpl

使用:

Plugin plugin = pluginManager.load("plugin", "PluginImpl");

或者您可以修改方法Plugin plugin = pluginManager.load("ru.sberbank.school.homework8.plugin", "PluginImpl"); 以添加前缀,假设您将始终从同一个根包中检索插件:

load