2
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)

クラスが見つからない理由がわかりません。インストルメンテーション エージェントが正常に読み込まれ、例外がスローされないことに注意してください。

4

2 に答える 2

2

javaagent に指定されたブート クラスパスと、-classpath で指定されたユーザー クラスパスに junit jar があったことがわかりました。つまり、agent.jar のマニフェストには次のエントリがありました。

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

また、java コマンドの -classpath 引数には次のものがありました。

-classpath ...junit.jar...

マニフェストのブート クラスパス エントリから junit.jar を削除することで、問題を解決できました。問題の簡単な説明は次のとおりです。

junit.jar がブート クラスパスに含まれていたため、最初にブート クラスローダーを使用して org.junit.runner.JUnitCore がロードされました。そのため、Class.forName が JunitCore 内で呼び出されたときに、ブート クラスパスの一部ではないため、クラスを見つけることができなかったブート クラスローダーを使用してクラスを見つけようとしました。

于 2010-12-22T20:38:06.647 に答える
0
some.package.HelloWorldTest 

CLASSPATH にありません。それを追加すると、すべてがうまくいきます。

于 2010-12-22T17:29:21.800 に答える