简体   繁体   English

Class.forname异常

[英]Class.forname Exception

all I'am trying to run a junit tests in this way: 我正在尝试以这种方式运行junit测试:

I've these files: 我有这些文件:

./tested/Resta.java ./tested/Resta.java
./tested/Suma.class ./tested/Suma.class
./tested/Suma.java ./tested/Suma.java
./tested/Resta.class ./tested/Resta.class
./test/TestResta.class ./test/TestResta.class
./test/TestSuma.java ./test/TestSuma.java
./test/TestSuma.class ./test/TestSuma.class
./test/TestResta.java ./test/TestResta.java
./Spumevaluador.class ./Spumevaluador.class
./Spumevaluador.java ./Spumevaluador.java

When I run Spumevaluador (java -cp /home/minyatur/.netbeans/7.2/modules/ext/junit-4.10.jar:. Spumevaluador) I get this error: 当我运行Spumevaluador(java -cp /home/minyatur/.netbeans/7.2/modules/ext/junit-4.10.jar :. Spumevaluador)时,出现以下错误:

minyatur@orome:~/codigo$ ./ejecuta.sh Hola Exception in thread "main" java.lang.NoClassDefFoundError: test/TestSuma (wrong name: TestSuma) at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClass(ClassLoader.java:787) at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) at java.net.URLClassLoader.defineClass(URLClassLoader.java:447) at java.net.URLClassLoader.access$100(URLClassLoader.java:71) at java.net.URLClassLoader$1.run(URLClassLoader.java:361) at java.net.URLClassLoader$1.run(URLClassLoader.java:355) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:354) at java.lang.ClassLoader.loadClass(ClassLoader.java:423) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) at java.lang.ClassLoader.loadClass(ClassLoader.java:356) at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Class.java:188) at Spumevaluador.main(Spumevaluador.java:45 minyatur @ orome:〜/ codigo $ ./ejecuta.sh Hola线程“ main”中的异常java.lang.NoClassDefFoundError:java的java.lang.ClassLoader.defineClass1(本机方法)处的test / TestSuma(错误的名称:TestSuma)。 lang.ClassLoader.defineClass(ClassLoader.java:787)在java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)在java.net.URLClassLoader.defineClass(URLClassLoader.java:447)在java.net.URLClassLoader.access在java.net.URLClassLoader $ 1.run(URLClassLoader.java:361 :)在java.net.URLClassLoader中$ 100(URLClassLoader.java:71)在java.security.AccessController.doPrivileged(Native方法),位于java.net.URLClassLoader.findClass(URLClassLoader.java:354),位于sun.misc.Launcher $ AppClassLoader.loadClass(Launcher.java:308),位于java.lang.ClassLoader.loadClass(ClassLoader.java:423)位于Spumevaluador.main(Spumevaluador.java)处的java.lang.Class.forName(Class.java:188)处的java.lang.Class.forName0(本机方法)处的java.lang.ClassLoader.loadClass(ClassLoader.java:356 :) 45 )

The Spumevaluador.java code: Spumevaluador.java代码:

import org.junit.runner.JUnitCore;
import java.util.Iterator;
import org.junit.internal.TextListener;
import org.junit.runner.Computer;
import org.junit.runner.Request;
import org.junit.runner.Result;
import org.junit.runner.notification.Failure;
import java.util.ArrayList;

public class Spumevaluador {

    public static void main(String[] args) throws ClassNotFoundException {

    System.out.println("Hola");
        ArrayList clases = new ArrayList();
        clases.add("test.TestSuma");
        clases.add("test.TestResta");        
        Class<?>[] cClases = new Class<?>[clases.size()];
        for (int i = 0; i < clases.size(); i++) {
            cClases[i] = Class.forName(clases.get(i).toString());
        }
        Request req = Request.classes(cClases);
        JUnitCore jUnitCore = new JUnitCore();
        jUnitCore.addListener(new TextListener(System.out));
        jUnitCore.run(req);
    }
}

It seems the invocation to Class.forname is not finding test.TestSuma, if I change Class.forname("TestSuma"); 如果我更改Class.forname(“ TestSuma”);似乎对Class.forname的调用未找到test.TestSuma。 and include ../test in classpath it works fine. 并在类路径中包含../test,效果很好。

Why? 为什么? Any ideas? 有任何想法吗?

Basically when you run Class.forName("test.TestSuma") it's trying to load a class called TestSuma in a package called test . 基本上,当您运行Class.forName("test.TestSuma")它将尝试在名为test的包中加载名为TestSuma的类。 It's looking for that in a class file called TestSuma.class in a directory called test . 它寻找,在名为类文件TestSuma.class在一个名为目录test

It finds the file - but the class that it loads is actually called TestSuma in the default package... so it fails. 找到了文件-但是它加载的类实际上在默认包中称为TestSuma ...因此失败。

It's not really clear what you're trying to achieve, but you should keep the class files in a structure which matches the package structure, and only try to load files using their proper fully-qualified class name. 它真不明白你达到什么样的,但是你应该保持类文件,其中封装结构相匹配的结构,只试图使用其应有的完全限定类名来加载文件。

It sounds like your TestSuma class is defined in the default package instead of the test package. 听起来您的TestSuma类是在默认包而不是测试包中定义的。 Try adding: 尝试添加:

package test;

to the top of the TestSuma.java file. 到TestSuma.java文件的顶部。

The Java classpath contains the locations where Java can find the root of the package hierarchy. Java类路径包含Java可以找到包层次结构根目录的位置。 If you have a class in the test package, you need to place the directory containing a "test" subdirectory in the classpath, not the test subdirectory itself. 如果测试包中有一个类,则需要在类路径中放置包含“ test”子目录的目录,而不是test子目录本身。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM