"NoClassDefFoundError" 当 运行 来自 Cygwin 终端的 JUnit 4
"NoClassDefFoundError" when running JUnit 4 from Cygwin terminal
早些时候,我下载了 junit-4.12.jar
和 hamcrest-core-1.3.jar
并将它们添加到我的 Windows CLASSPATH
。当我想 运行 一个 JUnit 测试时,我打开 Cygwin 终端,导航到我的测试目录 class,然后 运行
$ java org.junit.runner.JUnitCore TestClass
或者,如果我不在正确的目录中,我会键入 class 的相对文件路径,由 \
分隔(我读到这在 Windows,甚至使用 Cygwin,当 运行ning java
或 javac
).
我从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.java
和 TestClass.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
早些时候,我下载了 junit-4.12.jar
和 hamcrest-core-1.3.jar
并将它们添加到我的 Windows CLASSPATH
。当我想 运行 一个 JUnit 测试时,我打开 Cygwin 终端,导航到我的测试目录 class,然后 运行
$ java org.junit.runner.JUnitCore TestClass
或者,如果我不在正确的目录中,我会键入 class 的相对文件路径,由 \
分隔(我读到这在 Windows,甚至使用 Cygwin,当 运行ning java
或 javac
).
我从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.java
和 TestClass.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