java 1程序与另一个程序交谈

时间:2012-08-24 03:52:13

标签: java load classnotfoundexception

我目前正致力于服务器的插件。在这个插件中,它需要从另一个文件夹中的类调用方法。这是一个例子:

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

这将是技能文件夹中的一个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”,我不知道为什么。我已经检查了几次,似乎一切都是正确的。我做错了什么?

1 个答案:

答案 0 :(得分:0)

你必须提到几点:

  1. 您的代码仅在您的clas位于根包中时才有效。如果你的类有一个包名,你必须从url中删除它:file是c:\ my \ classes \ java \ lang \ String.class然后url必须是// file:/ c:/ my / classes。
  2. 大多数服务器使用类加载器hirachy,以启用动态添加类(几乎与您尝试)。如果您的类依赖于其他类,而不包含在bootstrap类路径中,则必须添加适当的父类加载器。
  3. 如果您的服务器是javaEE服务器(无论是仅支持ejb支持还是servlet运行),并且您不在服务器本身上工作,则ejb规范禁止创建自己的类加载器。这是因为无法以便携方式获得正确的父类加载器。
  4. 大多数服务器允许为不同级别的类加载hirarchy上的类配置其他路径。
  5. 如果使用某个javaEE服务器,则应指定问题中的哪一个。