2016-10-08 21 views
-2

私は私のクラスローダ書いた:私はそれを実行するとNoClassDefFoundError。なぜ???どうすれば修正できますか?

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!"); 
    } 
} 
+0

パッケージの宣言とimportstatementsを追加してください。どのようにプログラムを実行する – Jens

+0

また表示してください 'PluginImpl' –

答えて

0

あなたのクラスの正しいFQNを提供していないため、このエラーを取得し、実際にあなたのload方法では、あなたの場合plugin.PluginImplになりますpluginName + "." + pluginClassNameに対応するクラスが、パッケージ名を検索してみてくださいPluginImplの実際のFQNはru.sberbank.school.homework8.plugin.PluginImplです。実際にはru.sberbank.school.homework8.pluginです。この問題を解決するには

、あなたは交換する必要があります。

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; 
+1

ありがとう!今それは動作します! –

関連する問題