当我在Eclipse外运行类时发生ClassNotFoundError

时间:2018-11-08 14:37:27

标签: java classnotfoundexception max-msp-jitter

我目前尝试使用mxj对象在Maxmsp中运行Java代码,并且我想在代码内部加载一些类。 但是,尽管代码可以在Eclipse中正常运行,但我总是会收到错误消息。

出什么问题了?

这是我的代码。 如果我使用Maxmsp,将调用call()

package Load;

import com.cycling74.max.*;

public class Loaded extends MaxObject{
    public static void main(String[] args) {
        //This works properly in eclipse
        call();
    }

    public void bang() {
        //This should work in Maxmsp, but get errors
        call();
    }

    public static void call() {
        try {
             //this is just a example
             //I want to load some classes which locate the same directory as this class
            Thread.currentThread().getContextClassLoader().loadClass("Load.Loaded");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

这是错误消息:

java.lang.ClassNotFoundException: Load.Loaded
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at Load.Loaded.call(Loaded.java:21)
    at Load.Loaded.bang(Loaded.java:16)

MXJ系统类路径为:

/Applications/Max.app/Contents/Resources/C74/packages/max-mxj/java-classes/lib/commons-codec-1.11.jar:
/Applications/Max.app/Contents/Resources/C74/packages/max-mxj/java-classes/lib/core.jar:
/Applications/Max.app/Contents/Resources/C74/packages/max-mxj/java-classes/lib/gluegen-rt-natives-macosx-universal.jar:
/Applications/Max.app/Contents/Resources/C74/packages/max-mxj/java-classes/lib/gluegen-rt.jar:
/Applications/Max.app/Contents/Resources/C74/packages/max-mxj/java-classes/lib/jitter.jar:
/Applications/Max.app/Contents/Resources/C74/packages/max-mxj/java-classes/lib/jode-1.1.2-pre-embedded.jar: 
/Applications/Max.app/Contents/Resources/C74/packages/max-mxj/java-classes/lib/jogl-all-natives-macosx-universal.jar: 
/Applications/Max.app/Contents/Resources/C74/packages/max-mxj/java-classes/lib/jogl-all.jar: 
/Applications/Max.app/Contents/Resources/C74/packages/max-mxj/java-classes/lib/max.jar: 
/Applications/Max.app/Contents/Resources/C74/packages/max-mxj/java-classes/lib/sadamLib.jar

MXJ类加载器的CLASSPATH为:

/Applications/Max.app/Contents/Resources/C74/packages/max-mxj/java-classes/classes/
/Applications/Max.app/Contents/Resources/C74/packages/max-mxj/java-classes/
/Users/MyName/Documents/ecllipse-workspace/009_Processing/bin

Loaded.class位于/Users/MyName/Documents/ecllipse-workspace/009_Processing/bin

2 个答案:

答案 0 :(得分:0)

您需要在类路径中包括所有依赖项:

java -cp "path/to/maxmsp.jar;path/to/dependency2.jar;path/to/your.jar" classpath.of.your.Main

如果您只是直接从类文件运行而没有JAR破坏您的项目,则可以省略path/to/your.jar并从与Main的类路径相同的目录中运行。

以上是用于从命令行运行Java。


由于Max正在运行并且正在控制类加载,因此我猜测sun.misc.Launcher$AppClassLoader无法正常工作。尝试调试,看看它在做什么。也可能尝试找到一种使用Max类加载器而不是Java AppClassLoader的方法。

答案 1 :(得分:0)

问题是Max无法正确加载类。 所以我创建了类加载器方法。

public static ClassLoader createClassLoader(String dirname) throws java.io.IOException {
    java.net.URL[] url = new java.net.URL[1];
    java.io.File file;
    if (dirname.endsWith("/")) {
        file = new java.io.File(dirname);
    }
    else {
        file = new java.io.File(dirname + "/");
    }
    url[0]= file.toURI().toURL();

    ClassLoader parent = ClassLoader.getSystemClassLoader();
    java.net.URLClassLoader loader = new java.net.URLClassLoader(url, parent);
    return loader
}

然后致电

ClassLoader loader = createClassLoader("ClassPath");
Class<?> c = Class.forName("Classname", true, loader);