2013-01-07 7 views
1

J'ai un projet avec des tests unitaires. J'utilise Maven et m2e. Avec Maven de la ligne de commande, je vois:Comment se débarrasser de org.hamcrest.core_1.1.0.v20090501071000.jar?

[INFO] | +- org.springframework:spring-test:jar:3.1.3.RELEASE:test 
[INFO] | \- junit:junit-dep:jar:4.10:test 
[INFO] +- org.mockito:mockito-core:jar:1.9.0:test 
[INFO] | +- org.hamcrest:hamcrest-core:jar:1.2.1:test 
[INFO] | \- org.objenesis:objenesis:jar:1.0:test 

mvn install travaux, tous les tests exécutés. Bien.

Maintenant, je tente d'exécuter les tests unitaires à partir d'Eclipse en utilisant M2e 1.2.0 et je reçois cette erreur:

java.lang.SecurityException: class "org.hamcrest.DiagnosingMatcher"'s signer information does not match signer information of other classes in the same package 
     at java.lang.ClassLoader.checkCerts(ClassLoader.java:806) 
     at java.lang.ClassLoader.preDefineClass(ClassLoader.java:487) 
     ... 
     at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) 
     at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) 
     at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) 

qui me déconcerte. L'arbre de dépendance dans m2e semble bon. Mais quand j'ouvre les propriétés du processus, je reçois un classpath modifié qui contient ces entrées supplémentaires:

.../eclipse/3.7.2/eclipse/plugins/org.junit_4.8.2.v4_8_2_v20110321-1705/junit.jar 
.../eclipse/plugins/org.hamcrest.core_1.1.0.v20090501071000.jar 

Depuis ces fichiers JAR sont signés, les tests échouent. Comment puis-je me débarrasser de ces deux entrées? Ou comment puis-je m'assurer qu'ils sont ajoutés tard dans le classpath (c'est-à-dire après ma version de JUnit + Hamcrest)?

Répondre

0

Il semble y avoir deux possibilités:

  1. Vous avez JUnit sur le chemin de classe déjà. Dans Propriétés du projet-> Chemin de construction Java, onglet Bibliothèques, avez-vous plusieurs bibliothèques junit sur le chemin, c'est à dire que vous avez ajouté la bibliothèque junit au projet. Si c'est le cas, retirez-le et réessayez.

  2. La cause la plus probable est votre utilisation de hamcrest 1.2. Ce n'est pas compatible avec JUnit 4.10 (ou 4.8 d'ailleurs). JUnit pré-4.11 incluait certaines des classes hamcrest 1.1, donc vous pouvez avoir des problèmes d'incompatibilité. Votre meilleur pari est de passer à la version 4.11, qui n'inclut pas les bibliothèques hamcrest, mais a hamcrest 1.3 comme dépendance transitive. Si vous pouvez utiliser hamcrest 1.3 faire, sinon, 1.2 devrait fonctionner.

+0

1. Junit est pas sur la Java Build Path 2. J'utilise 'junit-dep' qui n'inclut aucune classe Hamcrest.Le problème est que le lanceur jdt Junit semble ajouter JUnit et Hamcrest au classpath (et aux anciennes versions, aussi) mais je ne sais pas trop comment l'éviter. –

4

J'ai trouvé une solution de contournement.

La raison de l'erreur est que le lanceur JUnit d'Eclipse ajoute le bundle JUnit et Hamcrest au chemin de classe. Ces deux sont des paquets Orbit signés tandis que les JAR de Maven ne sont pas signés.

Hamcrest 1.2 contient plus de classes que Hamcrest 1.1 d'Eclipse. Si Hamcrest 1.1 est chargé en premier, Java s'attend à ce que toutes les classes du package org.hamcrest partagent les mêmes signatures cryptographiques. Ce n'est pas vrai et il n'y a aucun moyen de résoudre ce problème.

L'erreur disparaît lorsque j'ajoute manuellement une dépendance via "Java Build Path" ou dans l'onglet "Classpath" de la configuration de lancement. Dans ces endroits, je peux m'assurer que les fichiers JAR de .m2/repository/ apparaissent en premier dans le chemin de classe (avant que le coureur JDT JUnit ajoute les fichiers JAR du dossier plugins d'Eclipse) afin que Java ne voit/essaie jamais de charger les paquets d'Orbit.

Dans la configuration de lancement, il ressemble à ceci:

Launch Configuration

Mais je préférerais que Eclipse ne plaisante pas avec mon classpath :-(

Questions connexes