0

私は現在、サーバー用のプラグインに取り組んでいます。そして、このプラグインでは、別のフォルダーのクラスからメソッドを呼び出す必要があります。次に例を示します。

public class LoadSkill{
private void load(String name, String type, CastingSkill cast){
    try{
        File folder = new File(this.plugin.getDataFolder(), "Skills");
        if(!folder.exists())folder.mkdirs();
        File[] files = folder.listFiles();
        if(files.length>0){
            for(File f : files){
                String skill = f.getName();
                skill = skill.substring(0, skill.length()-4);
                if(name.equals(skill)){
                    URL loadPath = f.toURI().toURL();
                    URL[] classUrl = new URL[]{loadPath};
                    ClassLoader cl = new URLClassLoader(classUrl);
                    Class loadedClass = Class.forName("run.skill.Start", false, cl);
                    if(cast!=null)loadedClass.getDeclaredMethod(name, CastingSkill.class).invoke(loadedClass.newInstance(), cast);
                    else loadedClass.getDeclaredMethod(name).invoke(loadedClass.newInstance());
                }
                return;
            }
        }
    }catch(Exception e){
        System.err.println("Error while trying to load skill " + name + "!");
        e.printStackTrace();
    }
}
}

これは、skills フォルダー内の jar ファイルになります。注: これは実行可能ではありません。そのため、main(String[] args) メソッドがありません。また、これは唯一のクラスです。はい、パスは上記の要求どおりに一致します。

public class Skill implements Castable{
    public void Enable(){System.out.println("Enabled")}
    public void Cast(){System.out.println("Casting")}
    public void StopAllTimers(){System.out.println("Stopped)}
    public void AddListener(){System.out.println("Listening")}
}

ただし、このコードを実行すると、「ClassNotFoundException」が発生し、その理由がわかりません。これを数回確認しましたが、すべて正しいようです。私は何を間違っていますか?

4

1 に答える 1

0

いくつかのことを言及する必要があります:

  1. コードは、クラスがルート パッケージにある場合にのみ機能します。クラスにパッケージ名がある場合は、URL からパッケージ名を削除する必要があります。
  2. ほとんどのサーバーは、クラスを動的に追加できるようにするために、一種のクラスローダーヒラキーで動作します (ほぼあなたがしようとしているように)。クラスがブートストラップ クラスパスに含まれていない他のクラスに依存している場合は、適切な親クラスローダーを追加する必要があります。
  3. サーバーが javaEE サーバー (ejb サポートまたはサーブレット ランナーのみのいずれであっても) であり、サーバー自体で作業しない場合、ejb 仕様は独自のクラスローダーの作成を禁止します。これは、移植可能な方法で正しい親クラスローダーを取得する方法がないためです。
  4. ほとんどのサーバーでは、さまざまなレベルのクラスローディング階層でクラスの追加パスを構成できます。

何らかの JavaEE サーバーを使用している場合は、質問でどれを指定する必要があります。

于 2012-08-24T10:13:31.757 に答える