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.
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 ichmvn clean test
ausführen, dann wird die Datei auftarget/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. –@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. –
Ich habe etwas mehr Nachforschungen gemacht und die Frage aktualisiert. Ich werde noch mehr suchen. Vielleicht funktioniert eine "Finde-zusätzlich-Klassenpfad-hier" -Anweisung. –