Ich habe festgestellt, dass in der JAR eines Maven-Artefakts das Attribut project.version in zwei Dateien enthalten ist:
META-INF/maven/${groupId}/${artifactId}/pom.properties
META-INF/maven/${groupId}/${artifactId}/pom.xml
Gibt es eine empfohlene Möglichkeit, diese Version zur Laufzeit zu lesen?
Antworten:
Sie sollten nicht auf Maven-spezifische Dateien zugreifen müssen, um die Versionsinformationen einer bestimmten Bibliothek / Klasse abzurufen.
Sie können einfach verwenden
getClass().getPackage().getImplementationVersion()
, um die Versionsinformationen abzurufen, die in einer .jar-Datei gespeichert sindMANIFEST.MF
.Zum Glück ist Maven klug genugLeider schreibt Maven standardmäßig auch nicht die richtigen Informationen in das Manifest!Stattdessen muss man das
<archive>
Konfigurationselement vonmaven-jar-plugin
to setaddDefaultImplementationEntries
undaddDefaultSpecificationEntries
totrue
wie folgt ändern :Idealerweise sollte diese Konfiguration in das Unternehmen
pom
oder einen anderen Basis-Pom übernommen werden.Eine ausführliche Dokumentation des
<archive>
Elements finden Sie in der Dokumentation zum Maven-Archiv .quelle
Um der obigen Antwort für ein
.war
Artefakt nachzugehen, musste ich die entsprechende Konfiguration anwenden aufmaven-war-plugin
anstattmaven-jar-plugin
:Dies fügte die Versionsinformationen
MANIFEST.MF
in das Projekt ein.jar
(enthalten inWEB-INF/lib
der.war
)quelle
null
obwohl die MANIFEST.MF in den Kriegsdateien die richtigen Informationen enthält.<archiveClasses>true</archiveClasses>
- und es funktioniert seitdem zuverlässig.Hier ist eine Methode, um die Version aus den pom.properties abzurufen und auf das Abrufen aus dem Manifest zurückzugreifen
quelle
Ich habe einige Zeit mit den beiden Hauptansätzen verbracht und sie haben für mich nicht funktioniert. Ich verwende Netbeans für die Builds. Vielleicht ist dort mehr los. Ich hatte einige Fehler und Warnungen von Maven 3 mit einigen Konstrukten, aber ich denke, diese waren leicht zu korrigieren. Kein Problem.
Ich habe in diesem Artikel auf DZone eine Antwort gefunden, die wartbar und einfach zu implementieren ist:
Ich habe bereits einen Unterordner für resources / config und habe meine Datei app.properties genannt, um die Art der Dinge, die wir dort aufbewahren können (wie eine Support-URL usw.), besser wiederzugeben.
Die einzige Einschränkung ist, dass Netbeans eine Warnung ausgibt, dass die IDE herausgefiltert werden muss. Nicht sicher, wo / wie. Es hat zu diesem Zeitpunkt keine Auswirkung. Vielleicht gibt es dafür eine Lösung, wenn ich diese Brücke überqueren muss. Viel Glück.
quelle
Ich benutze
maven-assembly-plugin
für meine Maven-Verpackung. Die Verwendung von Apache Maven Archiver in Joachim Sauers Antwort könnte auch funktionieren:Da Archiever eine der gemeinsam genutzten Maven-Komponenten ist , kann es von mehreren Maven-Building-Plugins verwendet werden. Dies kann auch zu Konflikten führen, wenn zwei oder mehr Plugins eingeführt werden, einschließlich der
archive
Konfiguration im Inneren.quelle
Um dies sowohl in Eclipse als auch in einem Maven-Build zum Laufen zu bringen, sollten Sie die Einträge
addDefaultImplementationEntries
undaddDefaultSpecificationEntries
pom wie in anderen Antworten beschrieben hinzufügen und dann den folgenden Code verwenden:Wenn Ihr Java-Build Zielklassen an einer anderen Stelle als "Ziel / Klassen" platziert, müssen Sie möglicherweise den Wert von segmentesToRemove anpassen.
quelle
System.getProperty("user.dir")/pom.xml
. Ich bin mir ziemlich sicher, dass dies auch für andere Dinge gilt, außer vielleicht nicht für WTP..getResource()
oder verwenden.getResourceAsStream()
.In meiner Spring-Boot-Anwendung funktionierte die Lösung aus der akzeptierten Antwort, bis ich kürzlich mein JDK auf Version 12 aktualisiert habe. Ich habe auch alle anderen Antworten ausprobiert und konnte das nicht zum Laufen bringen.
Zu diesem Zeitpunkt fügte ich der ersten Klasse meiner Spring Boot-Anwendung unmittelbar nach der Anmerkung die folgende Zeile hinzu
@SpringBootApplication
Später verwende ich Folgendes, um den Wert aus der Eigenschaftendatei in der Klasse abzurufen, in der ich den Wert verwenden möchte, und
appVersion
erhalte die Projektversion für mich:Hoffe das hilft jemandem.
quelle
Eine einfache Lösung, die Maven-kompatibel ist und für jede Klasse (also auch für Dritte) funktioniert:
quelle
Java 8-Variante für EJB in Kriegsdatei mit Maven-Projekt. Getestet auf EAP 7.0.
quelle