Wie mache ich das Manifest während eines Maven/Surefire-Unittestlaufs "mvn test" verfügbar?
Ich habe ein Open-Source-Projekt, das ich von Ant zu Maven konvertiere, einschließlich seiner Unit-Tests. Hier ist das Quellcode-Repository des Projekts mit dem Maven-Projekt: http://github.com/znerd/logdoc
Meine Frage bezieht sich auf das primäre Modul, genannt "Basis". Dieses Modul hat einen Unit-Test, der das Verhalten der statischen Methode testet getVersion()
in der Klasse org.znerd.logdoc.Library
. Diese Methode gibt zurück:
Library.class.getPackage().getImplementationVersion()
Le site getImplementationVersion()
Methode gibt den Wert einer Einstellung in der Manifestdatei zurück. So weit, so gut. Ich habe dies in der Vergangenheit getestet und es funktioniert gut, solange das Manifest tatsächlich auf dem Klassenpfad unter folgendem Pfad verfügbar ist META-INF/MANIFEST.MF
(entweder im Dateisystem oder in einer JAR-Datei).
Jetzt ist mein Problem, dass die Manifestdatei nicht verfügbar ist, wenn ich die Unit-Tests ausführe:
mvn test
Surefire führt die Unit-Tests aus, aber mein Unit-Test schlägt mit einer Meldung fehl, die angibt, dass Library.getVersion()
zurückgegeben null
.
Wenn ich die JAR-Datei überprüfen möchte, stelle ich fest, dass sie noch nicht einmal generiert wurde. Maven/Surefire führt die Unit-Tests gegen die Klassen aus, vor werden die Ressourcen dem Klassenpfad hinzugefügt.
Weitere Untersuchungen zeigen, dass Surefire seine eigene JAR-Datei in einem temporären Verzeichnis erzeugt, z. B.
/private/var/folders/TR/TREvj1wIHYyAcUy-xmc3UU+++TI/-Tmp-/surefirebooter7448562488934426857.jar
Und verwendet dann dieses JAR, um die Library-Klasse zu laden. Dieses JAR enthält nicht die Ressourcen, die ich unter src/main/resources
. Daher wird eine META-INF/MANIFEST.MF
Datei funktioniert ebenfalls nicht.
Wie kann ich Surefire sagen, dass ich meine META-INF/MANIFEST.MF
Datei, die über denselben Classloader verfügbar ist wie die Library
Klasse.
Beachten Sie, dass ich Maven 2.2.0, Java 1.6.0_17 auf Mac OS X 10.6.2, mit JUnit 4.8.1 verwende.