2010-05-26 5 views
9

Wie stelle ich das Manifest während eines Mavent/Surefire-Komponententests "mvn test" zur Verfügung?Wie stelle ich das Manifest während eines Maven/Surefire-Komponententests "mvn test" zur Verfügung?

Ich habe ein Open-Source-Projekt, das ich von Ant zu Maven konvertieren, einschließlich seiner Komponententests. Hier ist das Projektquellenrepository mit dem Maven-Projekt:

Meine Frage bezieht sich auf das primäre Modul, "Base" genannt. Dieses Modul verfügt über einen Komponententest, der das Verhalten der statischen Methode getVersion() in der Klasse org.znerd.logdoc.Library testet. Diese Methode gibt:

Library.class.getPackage().getImplementationVersion() 

Die getImplementationVersion() Methode gibt einen Wert einer Einstellung in der Manifest-Datei. So weit, ist es gut. Ich habe dies in der Vergangenheit getestet und es funktioniert gut, solange das Manifest tatsächlich auf dem Klassenpfad unter dem Pfad META-INF/MANIFEST.MF (entweder im Dateisystem oder in einer JAR-Datei) verfügbar ist.

Jetzt ist meine Herausforderung, dass die Manifest-Datei nicht verfügbar ist, wenn ich die Unit-Tests laufen:

mvn test 

todsichere die Unit-Tests läuft, aber meine Unit-Test mit einem mesage nicht darauf hinweist, dass Library.getVersion()null zurückgegeben.

Wenn ich das JAR überprüfen möchte, finde ich, dass es nicht einmal erzeugt wurde. Maven/Surefire führt die Komponententests für die Klassen aus, bevor die Ressourcen dem Klassenpfad hinzugefügt werden.

Weitere Untersuchung zeigt, dass Surefire eine eigene JAR-Datei in einem temporären Verzeichnis, z.

/private/var/folders/TR/TREvj1wIHYyAcUy-xmc3UU+++TI/-Tmp-/surefirebooter7448562488934426857.jar 

Und dann verwendet diese JAR, um die Bibliotheksklasse zu laden. Diese JAR enthält nicht die Ressourcen, die ich unter src/main/resources festhielt. Also funktioniert eine META-INF/MANIFEST.MF Datei auch nicht.

Also wie sage ich Surefire, um meine META-INF/MANIFEST.MF Datei von der gleichen Klasse Loader wie die Library Klasse zur Verfügung zu haben.

Beachten Sie, dass ich Maven 2.2.0, Java 1.6.0_17 unter Mac OS X 10.6.2 mit JUnit 4.8.1 verwende.

Antwort

2

Nun, wie Sie Sie darauf, das Problem ist, dass die MANIFEST.MF während package erzeugt und direkt in dem letzten Glas eingeschlossen und all dies tritt nach test. Also ich denke, Sie müssen entweder:

  • your own MANIFEST.MF liefern (das wäre in target/classes verfügbar sein, bevor während package verschmolzen werden). Ich weiß nicht, ob das eine Option ist (und ob es funktionieren wird).
  • Setzen und führen Sie Ihren Test von einem anderen Modul abhängig von der JAR.
+0

Pascal, vielen Dank für die Antwort.Ich habe beide versucht: Wenn ich eine Datei src/main/resources/META-INF/MANIFEST.MF hinzufügen und ich mvn clean test ausführen, dann wird die Datei auf target/classes/META-INF/MANIFEST.MF kopiert, aber es ist offenbar immer noch nicht für den Komponententest zugänglich. Wenn ich auf die JAR von einem anderen Modul innerhalb des gleichen Projekts angewiesen bin, wird die JAR nicht verwendet, sondern das generierte Klassenverzeichnis. Ich habe dafür issue report SUREFIRE-620 erstellt. –

+0

@Ernst Nun, ich habe dir nicht geholfen, aber du bist willkommen :) Ich hatte große Zweifel an der ersten Lösung, aber es sieht so aus, als ob ich zu zuversichtlich für die zweite war. Vielen Dank für die Veröffentlichung der Jira-Ausgabe, es ist ein interessanter Fall. –

+0

Ich habe etwas mehr Nachforschungen gemacht und die Frage aktualisiert. Ich werde noch mehr suchen. Vielleicht funktioniert eine "Finde-zusätzlich-Klassenpfad-hier" -Anweisung. –