Was ist der einfachste Weg, um die Versionsnummer aus der pom.xml von maven im Code abzurufen, dh programmgesteuert?
Angenommen, Sie verwenden Java, können Sie
Erstellen Sie eine .properties
Datei in Ihrem src/main/resources
Verzeichnis (am häufigsten) (in Schritt 4 können Sie sie jedoch anweisen, woanders zu suchen).
Legen Sie den Wert einer Eigenschaft in Ihrer .properties
Datei mithilfe der Standardeigenschaft Maven für die Projektversion fest: foo.bar=${project.version}
Laden Sie in Ihrem Java-Code den Wert aus der Eigenschaftendatei als Ressource aus dem Klassenpfad (Google für zahlreiche Beispiele, aber hier ein Beispiel für den Anfang ).
Aktivieren Sie in Maven die Ressourcenfilterung. Dadurch kopiert Maven diese Datei in Ihre Ausgabeklassen und übersetzt die Ressource während dieser Kopie, wobei die Eigenschaft interpretiert wird. Sie können hier einige Informationen finden, aber Sie tun dies meistens nur in Ihrem Pom:
<build> <Ressourcen> <Ressource> <Verzeichnis> src / main / resources </ Verzeichnis> <filtering> true </ filtering> </ resource> </ resources> </ build>
Sie können auch auf andere Standardeigenschaften wie erhalten project.name
, project.description
oder auch beliebige Eigenschaften , die Sie in Ihrem pom setzen <properties>
usw. Ressourcenfilterung, mit Maven Profilen kombiniert, können Sie bei der Erstellung variabler Build Verhalten geben. Wenn Sie zur Laufzeit ein Profil mit angeben -PmyProfile
, können Eigenschaften aktiviert werden, die dann in Ihrem Build angezeigt werden können.
src/main/resources
, da hierdurch möglicherweise alle in diesem Verzeichnis befindlichen Dateien verarbeitet werden, einschließlich Binärdateien. Um unvorhersehbare Verhaltensweisen zu vermeiden, ist es besser, nach einemsrc/main/resources-filtered
Verzeichnis zu filtern , wie hier vorgeschlagen . Trotzdem danke für diesen schönen Trick!Die akzeptierte Antwort ist möglicherweise der beste und stabilste Weg, um eine Versionsnummer statisch in eine Anwendung zu übernehmen , beantwortet jedoch nicht die ursprüngliche Frage: Wie kann die Versionsnummer des Artefakts aus pom.xml abgerufen werden? Daher möchte ich eine Alternative anbieten, die zeigt, wie dies zur Laufzeit dynamisch gemacht wird:
Sie können Maven selbst verwenden. Genauer gesagt können Sie eine Maven-Bibliothek verwenden.
Und dann machen Sie so etwas in Java:
Das Konsolenprotokoll lautet wie folgt:
Update 31.10.2017: Um die Folgefrage von Simon Sobisch zu beantworten, habe ich das Beispiel folgendermaßen geändert:
quelle
package
D-JAR aus gestartet werde (Abhängigkeitsklassen sind nicht integriert) und funktioniert nicht, wennjar-with-dependencies
ich mit dem Maven-Assembly-Plugin gepackt bin, das ich bekomme ajava.io.FileNotFoundException: pom.xml
(es ist im letzten Glas alsMETA-INF/maven/my.package/myapp/pom.xml
) - irgendwelche Hinweise, wie man das löst?Gepackte Artefakte enthalten eine
META-INF/maven/${groupId}/${artifactId}/pom.properties
Datei, deren Inhalt wie folgt aussieht:Viele Anwendungen verwenden diese Datei, um die Anwendungs- / JAR-Version zur Laufzeit zu lesen. Es ist kein Setup erforderlich.
Das einzige Problem bei dem obigen Ansatz besteht darin, dass diese Datei (derzeit) während der
package
Phase generiert wird und daher während Tests usw. nicht vorhanden ist (es gibt ein Jira-Problem, um dies zu ändern, siehe MJAR-76 ). Wenn dies ein Problem für Sie ist, ist der von Alex beschriebene Ansatz der richtige Weg.quelle
Es gibt auch die unter Einfache Methode beschriebene Methode , um die Versionsnummer Ihrer Apps mit Maven anzuzeigen :
Fügen Sie dies zu pom.xml hinzu
Dann benutze dies:
Ich habe festgestellt, dass diese Methode einfacher ist.
quelle
getImplementationVersion()
warnull
. (Maven Version 3.0.4).war
maven-war-plugin
maven-jar-plugin
getImplementationVersion()
gibt null zurück).Wenn Sie MVN-Verpackungen wie Jar oder War verwenden, verwenden Sie:
Es liest eine Eigenschaft "Implementation-Version" der generierten META-INF / MANIFEST.MF (die auf die Version von pom.xml festgelegt ist) im Archiv.
quelle
Als Ergänzung zu dem, was @kieste gepostet hat, ist dies meiner Meinung nach der beste Weg, um Maven-Build-Informationen in Ihrem Code verfügbar zu machen, wenn Sie Spring-boot verwenden: die Dokumentation unter http://docs.spring.io/spring-boot/ docs / current / reference / htmlsingle / # Production-Ready-Application-Info ist sehr nützlich.
Sie müssen nur die Aktuatoren aktivieren und die Eigenschaften hinzufügen, die Sie in Ihrem
application.properties
oder benötigenapplication.yml
quelle
Verwenden Sie diese Bibliothek, um eine einfache Lösung zu vereinfachen. Fügen Sie dem Manifest alles hinzu, was Sie benötigen, und fragen Sie dann nach Zeichenfolge ab.
http://manifests.jcabi.com/index.html
quelle
Manchmal reicht die Maven-Befehlszeile aus, wenn Skripte für die Projektversion erstellt werden, z. B. zum Abrufen von Artefakten über eine URL aus einem Repository:
Anwendungsbeispiel:
quelle
Holen Sie sich die Version mit
this.getClass().getPackage().getImplementationVersion()
PS Vergessen Sie nicht hinzuzufügen:
quelle
In Bezug auf Ketankks Antwort :
Leider hat das Hinzufügen dies den Umgang meiner Anwendung mit Ressourcen durcheinander gebracht:
Aber die Verwendung dieses <manifest> -Tags im Maven-Assemble-Plugin hat den Trick getan:
So konnte ich Version mit bekommen
quelle