JUnit4:无法 运行 在 JAR 中测试用例,而 lib 目录在其外部
JUnit4: Can't run test cases inside a JAR with lib directory outside it
我的任务很简单:运行 JUnit4 从终端进行测试,将我的 Java classes 放入一个 JAR 文件中,并将其依赖项放在该 JAR 之外的目录中(lib/
).为此,我正在使用 Maven 和 Maven Assembly 插件。
我 运行 使用 JUnitCore class 进行测试,例如,这是在我的 main()
方法中 example.Main
class:
JUnitCore.runClasses(example.mypackage.MyClass.class);
问题是当我 运行 带有 java -cp my-jar-file.jar example.Main -someArguments
的 JAR 文件时,我得到这个错误:
Exception in thread "main" java.lang.NoClassDefFoundError: org/junit/runner/JUnitCore
at example.Main.main(Main.java:21)
Caused by: java.lang.ClassNotFoundException: org.junit.runner.JUnitCore
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)
... 1 more
我的目录树是(注意 JUnit 依赖项 junit-4.11.jar
在 JAR 之外):
.
├── my-jar-file.jar
└── lib
├── commons-beanutils-1.8.0.jar
├── commons-codec-1.10.jar
├── commons-collections-3.2.1.jar
├── commons-io-2.4.jar
├── commons-lang-2.5.jar
├── commons-lang3-3.4.jar
├── commons-logging-1.1.1.jar
├── cssparser-0.9.16.jar
├── ezmorph-1.0.6.jar
├── hamcrest-core-1.3.jar
├── htmlunit-2.18.jar
├── htmlunit-core-js-2.17.jar
├── httpclient-4.5.jar
├── httpcore-4.4.1.jar
├── httpmime-4.5.jar
├── jcl-over-slf4j-1.6.6.jar
├── jetty-io-9.2.12.v20150709.jar
├── jetty-util-9.2.12.v20150709.jar
├── json-lib-2.4-jdk15.jar
├── junit-4.11.jar
├── jwebunit-core-3.3.jar
├── jwebunit-htmlunit-plugin-3.3.jar
├── log4j-1.2.17.jar
├── mysql-connector-java-5.1.6.jar
├── nekohtml-1.9.22.jar
├── regexp-1.3.jar
├── sac-1.3.jar
├── serializer-2.7.2.jar
├── servlet-api-2.5.jar
├── slf4j-api-1.7.5.jar
├── slf4j-log4j12-1.7.5.jar
├── websocket-api-9.2.12.v20150709.jar
├── websocket-client-9.2.12.v20150709.jar
├── websocket-common-9.2.12.v20150709.jar
├── xalan-2.7.2.jar
├── xercesImpl-2.11.0.jar
└── xml-apis-1.4.01.jar
这是 JUnit4 的问题吗?还是我做错了什么?
谢谢!
您需要将 lib
的内容显式添加到类路径中。尝试
java -cp my-jar-file.jar:lib/\* example.Main -someArguments
如果你在 unix 上。在 windows 上将 :
替换为 ;
并可能删除 *
之前的 \
;查看 docs 了解详情。
我的任务很简单:运行 JUnit4 从终端进行测试,将我的 Java classes 放入一个 JAR 文件中,并将其依赖项放在该 JAR 之外的目录中(lib/
).为此,我正在使用 Maven 和 Maven Assembly 插件。
我 运行 使用 JUnitCore class 进行测试,例如,这是在我的 main()
方法中 example.Main
class:
JUnitCore.runClasses(example.mypackage.MyClass.class);
问题是当我 运行 带有 java -cp my-jar-file.jar example.Main -someArguments
的 JAR 文件时,我得到这个错误:
Exception in thread "main" java.lang.NoClassDefFoundError: org/junit/runner/JUnitCore
at example.Main.main(Main.java:21)
Caused by: java.lang.ClassNotFoundException: org.junit.runner.JUnitCore
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)
... 1 more
我的目录树是(注意 JUnit 依赖项 junit-4.11.jar
在 JAR 之外):
.
├── my-jar-file.jar
└── lib
├── commons-beanutils-1.8.0.jar
├── commons-codec-1.10.jar
├── commons-collections-3.2.1.jar
├── commons-io-2.4.jar
├── commons-lang-2.5.jar
├── commons-lang3-3.4.jar
├── commons-logging-1.1.1.jar
├── cssparser-0.9.16.jar
├── ezmorph-1.0.6.jar
├── hamcrest-core-1.3.jar
├── htmlunit-2.18.jar
├── htmlunit-core-js-2.17.jar
├── httpclient-4.5.jar
├── httpcore-4.4.1.jar
├── httpmime-4.5.jar
├── jcl-over-slf4j-1.6.6.jar
├── jetty-io-9.2.12.v20150709.jar
├── jetty-util-9.2.12.v20150709.jar
├── json-lib-2.4-jdk15.jar
├── junit-4.11.jar
├── jwebunit-core-3.3.jar
├── jwebunit-htmlunit-plugin-3.3.jar
├── log4j-1.2.17.jar
├── mysql-connector-java-5.1.6.jar
├── nekohtml-1.9.22.jar
├── regexp-1.3.jar
├── sac-1.3.jar
├── serializer-2.7.2.jar
├── servlet-api-2.5.jar
├── slf4j-api-1.7.5.jar
├── slf4j-log4j12-1.7.5.jar
├── websocket-api-9.2.12.v20150709.jar
├── websocket-client-9.2.12.v20150709.jar
├── websocket-common-9.2.12.v20150709.jar
├── xalan-2.7.2.jar
├── xercesImpl-2.11.0.jar
└── xml-apis-1.4.01.jar
这是 JUnit4 的问题吗?还是我做错了什么?
谢谢!
您需要将 lib
的内容显式添加到类路径中。尝试
java -cp my-jar-file.jar:lib/\* example.Main -someArguments
如果你在 unix 上。在 windows 上将 :
替换为 ;
并可能删除 *
之前的 \
;查看 docs 了解详情。