"NoClassDefFoundError" 当 运行 来自 Cygwin 终端的 JUnit 4

"NoClassDefFoundError" when running JUnit 4 from Cygwin terminal

早些时候,我下载了 junit-4.12.jarhamcrest-core-1.3.jar 并将它们添加到我的 Windows CLASSPATH。当我想 运行 一个 JUnit 测试时,我打开 Cygwin 终端,导航到我的测试目录 class,然后 运行

$ java org.junit.runner.JUnitCore TestClass

或者,如果我不在正确的目录中,我会键入 class 的相对文件路径,由 \ 分隔(我读到这在 Windows,甚至使用 Cygwin,当 运行ning javajavac).

我从TestClass.java编译了测试class,这是别人提供的。测试最初应该抛出 testThrowsIllegalArgumentException(),但我却收到 NoClassDefFoundError——就好像程序在实际测试本身之前以某种方式失败了——随后是堆栈跟踪:

JUnit version 4.12
Exception in thread "main" java.lang.NoClassDefFoundError: proj/TestClass (wrong name: TestClass)
        at java.base/java.lang.ClassLoader.defineClass1(Native Method)
        at java.base/java.lang.ClassLoader.defineClass(Unknown Source)
        ...
        at org.junit.runner.JUnitCore.runMain(JUnitCore.java:72)
        at org.junit.runner.JUnitCore.main(JUnitCore.java:36)

(中间有更多堆栈跟踪,我已将其删除以保存 space 因为对我来说唯一重要的内部步骤是开始和结束。我可以编辑 post不过,如有必要,包括完整的堆栈跟踪。)

我查看了所有其他我认为相关的常见问题解答和 StackExchange 线程,但没有找到问题的答案。现在看来,可能跟CLASSPATH有关。我已经尝试添加测试 class 的目录和它使用 java -cp 测试的原始 class 的目录,但就像其他所有内容一样,它没有用。任何进一步的帮助将不胜感激,因为我现在完全不知所措。

经过多次试验,终于解决了自己的问题

我的项目目录最初是为 Eclipse 而设计的(我很早就决定,如果可以的话,我宁愿不安装 Eclipse,这可能就是我一开始遇到这个问题的原因)。它的结构如下:

proj  
| src  
| | main  
| | | java  
| | | | proj  
| | | | | Class.java  
| | | | | Class.class  
| | | | | [other java files]  
| | test  
| | | java  
| | | | proj  
| | | | | TestClass.java  
| | | | | TestClass.class  
| | | | | [other java test files]  
| [other directories]

此外,文件 Class.javaTestClass.java 的开头都有语句 package proj;。显然这意味着在编译之后,例如 TestClass,我需要在调用 java 时从父目录 将其引用为 proj.TestClass 终端。

如果我对错误消息多加注意,我就会发现 java 特别期待 proj/TestClass。从这个 answer to a separate question:

The argument to java is not a file, it is the fully qualified classname of a class inside the classpath (the main class that you want to execute).

最终有效的 Cygwin 命令:

$ cd proj/src
$ java -cp "$CLASSPATH;main\java;test\java" org.junit.runner.JUnitCore proj.TestClass

由于我最终仍在使用 Windows,java 是一个 Windows 命令,因此 -cp 的参数需要格式化为 Windows-样式路径列表。

我在 Windows 上的 CLASSPATH.;%JUNIT_HOME%\junit-4.12.jar;%JUNIT_HOME%\hamcrest-core-1.3.jar