[英]java: NoClassDefFoundError when running from terminal but not from netbeans
[英]“NoClassDefFoundError” when running JUnit 4 from Cygwin terminal
之前,我下载了junit-4.12.jar
和hamcrest-core-1.3.jar
并将它们添加到Windows CLASSPATH
。 当我想运行JUnit测试时,我打开Cygwin终端,导航到测试类的目录,然后运行
$ java org.junit.runner.JUnitCore TestClass
或者,如果我不在正确的目录中,请输入以\\
分隔的类的相对文件路径(我已经读到,在Windows上,即使运行java
或javac
,即使使用Cygwin,这也是必需的)。
我从其他人提供的TestClass.java
编译了测试类。 该测试最初应该抛出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)
(在它们之间有更多的堆栈跟踪,为了节省空间,我删除了它们,因为对我而言,唯一重要的内部步骤是开始和结束。不过,如有必要,我可以编辑该帖子以包括完整的堆栈跟踪。)
我已经查看了我认为相关的所有其他常见问题解答和StackExchange线程,而没有找到问题的答案。 现在看来,它可能与CLASSPATH
。 我试过添加测试类的目录和使用java -cp
进行测试的原始类的目录,但是像其他所有东西一样,它没有用。 任何进一步的帮助将不胜感激,因为我现在完全不知所措。
经过大量的实验,我终于解决了自己的问题。
我的项目目录最初是为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
其称为proj.TestClass
。
如果我一直更加关注该错误消息,我会发现java
特别期待proj/TestClass
。 从这个答案到一个单独的问题 :
java
的参数不是文件,它是类路径(您要执行的主类)内的类的完全限定类名。
最终运行的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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.