NoClassDefFoundError。为什么???我该如何解决?
NoClassDefFoundError. Why??? How can I fix it?
我写了我的类加载器:
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();
}
}
}
Exception in thread "main" java.lang.NoClassDefFoundError:
plugin/PluginImpl (wrong name:
ru/sberbank/school/homework8/plugin/PluginImpl) at
java.lang.ClassLoader.defineClass1(Native Method)
我收到 NoClassDefFoundError。为什么???我该如何解决???
请帮帮我!
package ru.sberbank.school.homework8.plugin;
public class PluginImpl implements Plugin {
@Override
public void doUseful() {
System.out.println("My plugin!");
}
}
您收到此错误是因为您没有提供 class 的正确 FQN,实际上在您的 load
方法中,您试图找到 class 对应的 pluginName + "." + pluginClassName
在你的情况下 plugin.PluginImpl
但你的 class PluginImpl
的包名实际上是 ru.sberbank.school.homework8.plugin
这样你的 class 的真实 FQN 是ru.sberbank.school.homework8.plugin.PluginImpl
.
要解决此问题,您需要更换:
Plugin plugin = pluginManager.load("plugin", "PluginImpl");
有:
Plugin plugin = pluginManager.load("ru.sberbank.school.homework8.plugin", "PluginImpl");
或者你可以修改你的方法 load
添加一个前缀,假设你总是从同一个根包中检索你的插件:
public Plugin load(String pluginName, String pluginClassName) {
String name = "ru.sberbank.school.homework8." + pluginName + "." + pluginClassName;
我写了我的类加载器:
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();
}
}
}
Exception in thread "main" java.lang.NoClassDefFoundError: plugin/PluginImpl (wrong name: ru/sberbank/school/homework8/plugin/PluginImpl) at java.lang.ClassLoader.defineClass1(Native Method)
我收到 NoClassDefFoundError。为什么???我该如何解决???
请帮帮我!
package ru.sberbank.school.homework8.plugin;
public class PluginImpl implements Plugin {
@Override
public void doUseful() {
System.out.println("My plugin!");
}
}
您收到此错误是因为您没有提供 class 的正确 FQN,实际上在您的 load
方法中,您试图找到 class 对应的 pluginName + "." + pluginClassName
在你的情况下 plugin.PluginImpl
但你的 class PluginImpl
的包名实际上是 ru.sberbank.school.homework8.plugin
这样你的 class 的真实 FQN 是ru.sberbank.school.homework8.plugin.PluginImpl
.
要解决此问题,您需要更换:
Plugin plugin = pluginManager.load("plugin", "PluginImpl");
有:
Plugin plugin = pluginManager.load("ru.sberbank.school.homework8.plugin", "PluginImpl");
或者你可以修改你的方法 load
添加一个前缀,假设你总是从同一个根包中检索你的插件:
public Plugin load(String pluginName, String pluginClassName) {
String name = "ru.sberbank.school.homework8." + pluginName + "." + pluginClassName;