Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从包加载类会产生NoClassDefFoundError_Java_Noclassdeffounderror_Dynamic Class Loaders - Fatal编程技术网

Java 从包加载类会产生NoClassDefFoundError

Java 从包加载类会产生NoClassDefFoundError,java,noclassdeffounderror,dynamic-class-loaders,Java,Noclassdeffounderror,Dynamic Class Loaders,我有一个小程序,它试图允许插件通过类文件复制到特定的ext目录 该程序源于,我试图对其进行简化,并添加目录扫描功能,以扫描原始代码缺少的包和目录 当运行原始代码时,它可以工作。当我添加目录和包扫描功能并在演示包上进行测试时,它失败了。以下是样本 接受动态加载的类文件作为插件的系统的目录布局: testpack-+ | +---PluginDemo.java | +---PluginFunction.java 测试

我有一个小程序,它试图允许插件通过类文件复制到特定的
ext
目录

该程序源于,我试图对其进行简化,并添加目录扫描功能,以扫描原始代码缺少的包和目录

当运行原始代码时,它可以工作。当我添加目录和包扫描功能并在演示包上进行测试时,它失败了。以下是样本

接受动态加载的类文件作为插件的系统的目录布局:

 testpack-+
          |
          +---PluginDemo.java
          |
          +---PluginFunction.java
测试插件的目录布局:

b-+
  |
  +---Fibonacci.java
  
testpack-+
         |
         +---PluginFunction.java
带有自定义类加载器的
PluginDemo
代码:

package testpack;

import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.util.*;

public class PluginDemo extends ClassLoader {

static String pluginsDir = "ext";
static File basePluginDir = null;
File directory;

static List plugins;

public static void main(String args[]) {
    PluginDemo demo = new PluginDemo();
    basePluginDir = new File(System.getProperty("user.dir") + File.separator + pluginsDir);
    demo.getPlugins(pluginsDir, "");
}

PluginDemo() {
    plugins = new ArrayList();
}

protected void getPlugins(String directory, String parent) {
    File dir = new File(System.getProperty("user.dir") + File.separator + directory);
    if (dir.exists() && dir.isDirectory()) {
        String[] files = dir.list();
        for (int i = 0; i < files.length; i++) {
            try {
                // Allows recursive targetting of nested directories
                String newTargetFile = System.getProperty("user.dir") + File.separator + directory + File.separator
                        + files[i];
                System.out.println("Targetting: " + newTargetFile);

                File currentTarget = new File(newTargetFile);
                if (currentTarget.isDirectory()) {
                    String newDirectoryTarget = directory + File.separator + files[i];
                    getPlugins(newDirectoryTarget, files[i]);
                }

                if (!files[i].endsWith(".class"))
                    continue;

                String childFile = parent + File.separator + files[i].substring(0, files[i].indexOf("."));
                Class c = loadClass(childFile);
                Class[] intf = c.getInterfaces();
                for (int j = 0; j < intf.length; j++) {
                    if (intf[j].getName().equals("PluginFunction")) {
                        PluginFunction pf = (PluginFunction) c.newInstance();
                        plugins.add(pf);
                        continue;
                    }
                }
            } catch (Exception ex) {
                System.err.println("File " + files[i] + " does not contain a valid PluginFunction class.");
                ex.printStackTrace();
            }
        }
    }
}

public Class loadClass(String name) throws ClassNotFoundException {
    return loadClass(name, true);
}

public Class loadClass(String classname, boolean resolve) throws ClassNotFoundException {
    try {
        Class c = findLoadedClass(classname);
        if (c == null) {
            try {
                c = findSystemClass(classname);
            } catch (Exception ex) {
            }
        }
        if (c == null) {
            String filename = classname.replace('.', File.separatorChar) + ".class";

            // Create a File object. Interpret the filename relative to the
            // directory specified for this ClassLoader.
            File baseDir = new File(System.getProperty("user.dir"));
            File f = new File(baseDir, PluginDemo.pluginsDir + File.separator + filename);
            int length = (int) f.length();
            byte[] classbytes = new byte[length];
            DataInputStream in = new DataInputStream(new FileInputStream(f));
            in.readFully(classbytes);
            in.close();
            c = defineClass(classname, classbytes, 0, length);
        }

        if (resolve)
            resolveClass(c);

        return c;
    } catch (Exception ex) {
        throw new ClassNotFoundException(ex.toString());
    }
}
}
Fibonacci.java
代码:

package b;

import testpack.PluginFunction;

public class Fibonacci implements PluginFunction {

    int parameter = 0;
    boolean hasError = false;

    public boolean hasError() {
        return hasError;
    }

    public void setParameter (int param) {
        parameter = param;
    }

    public int getResult() {
        hasError = false;
        return fib(parameter);
    }

    protected int fib (int n) {
        if (n < 0) {
            hasError = true;
            return 0;
        }

        if (n == 0)
            return 0;
        else if (n == 1)
            return 1;
        else
            return fib(n-1) + fib(n-2); 
    }

    public String getPluginName() {
        return "Fibonacci";
    }
}

我需要帮助才能让这个包和目录扫描功能的类加载器工作。谢谢。

查看错误和方法,我认为name参数必须有
作为包分隔符,而不是
/
\

在getPlugins中的代码中,子文件是使用File.separator构建的

String childFile = parent + File.separator + files[i].substring(0, files[i].indexOf("."));
Class c = loadClass(childFile);
Targetting: C:\Users\Administrator\eclipse-workspace\TestPluginSystem\ext\b\Fibonacci.class
Exception in thread "main" java.lang.NoClassDefFoundError: b\Fibonacci (wrong name: b/Fibonacci)
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:760)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:642)
    at testpack.PluginDemo.loadClass(PluginDemo.java:89)
    at testpack.PluginDemo.loadClass(PluginDemo.java:65)
    at testpack.PluginDemo.getPlugins(PluginDemo.java:47)
    at testpack.PluginDemo.getPlugins(PluginDemo.java:40)
    at testpack.PluginDemo.main(PluginDemo.java:19)
String childFile = parent + File.separator + files[i].substring(0, files[i].indexOf("."));
Class c = loadClass(childFile);