Использование javaagent с Junit вызывает ClassNotFoundException в Class.forName - PullRequest
2 голосов
/ 22 декабря 2010
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 ]

2 голосов
/ 22 декабря 2010

Оказывается, у меня был джунит jar в пути загрузки, указанный для javaagent, а также путь пользователя, указанный в -classpath, т.е. в манифесте agent.jar была следующая запись:

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

и аргумент -classpath для команды java содержал следующее:

-classpath ...junit.jar...

Мне удалось решить эту проблему, удалив junit.jar из записи пути к загрузочному классу манифеста. Вот краткое объяснение проблемы:

Поскольку файл junit.jar был включен в путь к загрузочному классу, org.junit.runner.JUnitCore был сначала загружен с помощью загрузчика загрузочных классов. Поэтому, когда Class.forName вызывался в JunitCore, он пытался найти класс с помощью загрузчика загрузчиков классов, который не смог найти класс, поскольку он не был частью пути загрузки классов.

0 голосов
/ 22 декабря 2010
some.package.HelloWorldTest 

нет в CLASSPATH.Добавьте его, и все будет хорошо.

...