在Junit中使用javaagent导致Class.forName中出现ClassNotFoundException

时间:2010-12-22 17:26:40

标签: java classloader junit4 javaagents

java -classpath requiredclasspath org.junit.runner.JUnitCore some.package.HelloWorldTest

结果:

JUnit version 4.8.1
.

Time: 0.005

OK (1 test)

可是:

java -javaagent:agent.jar -classpath requiredclasspath org.junit.runner.JUnitCore some.package.HelloWorldTest    

结果:

JUnit version 4.8.1
Could not find class: some.package.HelloWorldTest

Time: 0.001

OK (0 tests)

核心问题似乎是:

Class.forName("some.package.HelloWorldTest") (runMain method, line 89, JunitCore)

抛出ClassNotFoundException,如下所示:

java.lang.ClassNotFoundException: some/package/HelloWorldTest
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:169)
at org.junit.runner.JUnitCore.runMain(JUnitCore.java:89)
at org.junit.runner.JUnitCore.runMainAndExit(JUnitCore.java:53)
at org.junit.runner.JUnitCore.main(JUnitCore.java:45)

我不知道为什么找不到这门课。请注意,检测代理程序已成功加载,并且不会引发任何异常。

2 个答案:

答案 0 :(得分:2)

原来我在为javaagent指定的引导类路径中有junit jar,以及通过-classpath指定的用户类路径,即agent.jar的manifest有以下条目:

Boot-Class-Path: ...junit.jar...

并且java命令的-classpath参数具有以下内容:

-classpath ...junit.jar...

我能够通过从manifest boot classpath条目中删除junit.jar来解决问题。以下是对该问题的简短解释:

由于junit.jar包含在引导类路径中,因此首先使用引导类加载器加载org.junit.runner.JUnitCore。因此,当在JunitCore中调用Class.forName时,它尝试使用无法找到该类的引导类加载器来查找该类,因为它不是引导类路径的一部分。

答案 1 :(得分:0)

some.package.HelloWorldTest 

不在CLASSPATH中。添加它,一切都会很好。