2016-10-08 2 views
-2

Ich schrieb meinen Klassenlader:NoClassDefFoundError. Warum??? Wie kann ich es reparieren?

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; 
    } 
} 

}

Wenn ich es laufen:

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)

I NoClassDefFoundError bekommen. Warum??? Wie kann ich es reparieren???

Hilf mir bitte!

package ru.sberbank.school.homework8.plugin; 

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

Bitte fügen Sie die Paket-Deklarationen und Importanweisungen und wie du das Programm ausführst – Jens

+0

bitte auch 'PluginImpl' zeigen –

Antwort

0

Sie diesen Fehler erhalten, weil Sie die richtige FQN Ihrer Klasse nicht bieten, in der Tat in Ihrer load Methode, versuchen Sie die Klasse zu finden, um pluginName + "." + pluginClassName entspricht, die plugin.PluginImpl in Ihrem Fall sein wird, aber die Paketnamen Ihrer Klasse PluginImpl ist eigentlich ru.sberbank.school.homework8.plugin so, dass die echte FQN Ihrer Klasse ru.sberbank.school.homework8.plugin.PluginImpl ist.

um dieses Problem zu beheben, müssen Sie ersetzen:

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

mit:

Plugin plugin = pluginManager.load("ru.sberbank.school.homework8.plugin", "PluginImpl"); 

Oder Sie könnten Ihre Methode ändern load ein Präfix hinzuzufügen, unter der Annahme, dass Sie immer Ihre Plugins abruft aus das gleiche root-Paket:

public Plugin load(String pluginName, String pluginClassName) { 
    String name = "ru.sberbank.school.homework8." + pluginName + "." + pluginClassName; 
+1

Vielen Dank! Jetzt funktioniert es!!! –

Verwandte Themen