2010-12-22 3 views
2
java -classpath requiredclasspath org.junit.runner.JUnitCore some.package.HelloWorldTest 

résultats dans:javaagent avec Junit est à l'origine ClassNotFoundException dans Class.forName

JUnit version 4.8.1 
. 

Time: 0.005 

OK (1 test) 

Mais:

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

résultats dans:

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

Time: 0.001 

OK (0 tests) 

La question fondamentale semble être cela:

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

lancers francs ClassNotFoundException comme suit:

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) 

Je ne sais pas pourquoi il ne peut pas trouver la classe. Notez que l'agent d'instrumentation est chargé avec succès et ne lance aucune exception.

+1

Que fait l'agent? – axtavt

+1

Il instrument de code de surveillance dans certaines classes. – Vilas

Répondre

2

Il s'avère que j'ai eu le pot de JUnit dans le classpath de démarrage spécifiée pour le javaagent ainsi que le classpath utilisateur spécifié par -classpath-à-dire le manifeste pour agent.jar a l'entrée suivante:

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

et la l'argument -classpath à la commande java avait les suivantes:

-classpath ...junit.jar... 

j'ai pu résoudre le problème en supprimant junit.jar de l'entrée classpath de démarrage manifeste. Voici une courte explication du problème:

Étant donné que junit.jar était inclus dans le chemin de classe de démarrage, org.junit.runner.JUnitCore a été chargé en premier à l'aide du chargeur de classe de démarrage. Ainsi, lorsque Class.forName a été invoqué dans JunitCore, il a tenté de trouver la classe à l'aide du chargeur de classes d'amorçage qui n'a pas pu trouver la classe car elle ne faisait pas partie du chemin de classe de démarrage.

0
some.package.HelloWorldTest 

n'est pas dans CLASSPATH. Ajoutez-le et tout ira bien.

+1

Merci pour la réponse. Malheureusement, ce n'est pas si simple. Comme vous pouvez le voir, si je n'utilise pas javaagent, la classe est trouvée et le test est exécuté avec succès. Ainsi, le classpath (requiredclasspath) doit contenir un fichier .package.HelloWorldTest. – Vilas

+0

bien sûr, c'est ce que je dis – duffymo

+1

Désolé, je suppose que je n'étais pas clair dans ma réponse. "some.package.HelloWorldTest" se trouve dans le classpath, c'est-à-dire que le répertoire contenant "some/package/HelloWorldTest.class" est inclus dans le chemin de classe. Toutefois, l'exception ClassNotFoundException est toujours levée lorsque l'agent Java est utilisé. – Vilas

Questions connexes