loadClass (String, Boolean) 메서드를 재정 의하여 classname을 변경하려고했습니다.NoClassDefFoundError (클래스 이름 변경)
저는 BukkitPlugin을 만들고 있습니다. Bukkitsource를 찾을 수 있습니다. here
클래스 로더 자체가 정상적으로 작동하고 테스트를 완료했으며 모든 클래스가 정상적으로 작동하므로 클래스 이름을 변경하기 시작한 후 오류가 발생하기 시작했습니다. 여기
는 방법입니다 :import java.io.File;
import java.lang.reflect.Field;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.HashMap;
import org.bukkit.plugin.java.JavaPlugin;
public class PluginClassLoader extends URLClassLoader {
private final HashMap<String, String> replace;
public PluginClassLoader(JavaPlugin p, HashMap<String, String> replace) throws Exception {
super(new URL[0], p.getClass().getClassLoader());
this.replace = replace;
File f = null;
Field file = JavaPlugin.class.getDeclaredField("file");
file.setAccessible(true);
f = (File) file.get(p);
addURL(f.toURI().toURL());
}
private final HashMap<String, Class<?>> classes = new HashMap<>();
@Override
public Class<?> loadClass(String name) throws ClassNotFoundException {
String s = replace.get(name);
if(s != null)
name = s;
Class<?> c;
try {
c = findClass(name);
} catch (Exception e) {
c = super.loadClass(name);
}
return c;
}
@Override
protected Class<?> loadClass(String name, boolean b)
throws ClassNotFoundException {
String s = replace.get(name);
if(s != null)
name = s;
Class<?> c;
try {
c = findClass(name);
} catch (ClassNotFoundException e) {
c = super.loadClass(name, b);
}
return c;
}
@Override
protected Class<?> findClass(String name) throws ClassNotFoundException {
if ((name.startsWith("org.bukkit."))
|| (name.startsWith("net.minecraft."))) {
throw new ClassNotFoundException(name);
}
Class<?> result = classes.get(name);
if (result == null) {
result = super.findClass(name);
classes.put(name, result);
}
return result;
}
}
을 그리고 난 클래스 로더를 사용할 때 나는 대체 클래스 중 하나를 사용하여 A NoClassDefFoundError를 매번 얻을. 내 최선의 추측은 내가 다른 방법을 오버라이드해야하지만 나는 그것이 무엇인지 알지 못한다.
오류 로그 :
java.lang.NoClassDefFoundError: org/bukkit/craftbukkit/v1_5_R3/CraftServer
at me.leo.itemeffects.IEPlugin.onEnable(IEPlugin.java:25)
at org.bukkit.plugin.java.JavaPlugin.setEnabled(JavaPlugin.java:217)
at org.bukkit.plugin.java.JavaPluginLoader.enablePlugin(JavaPluginLoader.java:457)
at org.bukkit.plugin.SimplePluginManager.enablePlugin(SimplePluginManager.java:381)
at org.bukkit.craftbukkit.v1_6_R2.CraftServer.loadPlugin(CraftServer.java:282)
at org.bukkit.craftbukkit.v1_6_R2.CraftServer.enablePlugins(CraftServer.java:264)
at net.minecraft.server.v1_6_R2.MinecraftServer.l(MinecraftServer.java:313)
at net.minecraft.server.v1_6_R2.MinecraftServer.f(MinecraftServer.java:290)
at net.minecraft.server.v1_6_R2.MinecraftServer.a(MinecraftServer.java:250)
at net.minecraft.server.v1_6_R2.DedicatedServer.init(DedicatedServer.java:151)
at net.minecraft.server.v1_6_R2.MinecraftServer.run(MinecraftServer.java:391)
at net.minecraft.server.v1_6_R2.ThreadServerApplication.run(SourceFile:582)
IEPlugin.java:25이 있습니다 :
CraftServer server = (CraftServer) Bukkit.getServer();
JVM이 잘못된 클래스를 정의를 검색
, 그것은, 패키지 'v1_5_R3'와 하나 보이지만, loadClass() 클래스의 이름을 'v1_6_R2'로 바꿨습니다.
org.bukkit.craftbukkit.v1_5_R3.CraftServer를 'org.bukkit.craftbukkit.v1_6_R2.CraftServer'로 바꿀 예정입니다. '
v1_5_R3 패키지에 클래스가 존재하지 않는, 즉 내가 읽기와 희망 향후 솔루션에 대한 loadClass (String, boolean) 메소드
덕분에 v1_6_R2로 변경하는 이유.
먼저 'NoClasDefFoundError'를 보여주세요. 둘째, 클래스 이름을 변경하려고하면 매우 어리 석다. – tbodt
String 클래스 이름을 변경하지 말고 메서드를 재정의하는 대신 오류 메시지를 공유 한 다음이 메서드에 전달하십시오. –