Apache Maven
Zugriff auf Maven-Informationen im Code
Suche…
Einführung
Es ist manchmal nützlich, die Maven-Eigenschaften, z. B. die aktuelle Version, im Code abzurufen. Hier sind einige Möglichkeiten dazu.
Die Versionsnummer aus einem Glas holen
Wenn Sie Ihre Anwendung mit dem maven-jar-plugin
oder dem maven-assembly-plugin
in ein jar
maven-jar-plugin
, können Sie zur aktuellen Pom-Version einfach einen Eintrag im Manifest hinzufügen, der dann in Java verfügbar ist.
Das Geheimnis besteht darin, das Flag addDefaultImplementationEntries
auf true zu setzen (und bei addDefaultSpecificationEntries
ist auch die Artefakt-ID erforderlich).
jar plugin konfiguration :
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<mainClass>...</mainClass>
<addDefaultImplementationEntries>
true
</addDefaultImplementationEntries>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>
Assembly Plugin Konfiguration :
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<addDefaultImplementationEntries>true</addDefaultImplementationEntries>
</manifest>
</archive>
</configuration>
<executions>
<execution .../>
</executions>
</plugin>
addDefaultImplementationEntries
weist Maven die folgenden Header an den hinzufügen MANIFEST.MF
Ihrer jar:
Implementation-Title: display-version
Implementation-Version: 1.0-SNAPSHOT
Implementation-Vendor-Id: test
Jetzt können Sie diese Codezeile überall in Ihrem Jar verwenden, um auf die Versionsnummer zuzugreifen:
getClass().getPackage().getImplementationVersion()
Mehr Informationen hier und hier .
Synchronisieren einer Eigenschaftendatei mithilfe der Eigenschaftsfilterung von maven
Wie diese Dokumentation erklärt,
Manchmal muss eine Ressourcendatei einen Wert enthalten, der nur zur Erstellungszeit angegeben werden kann. Um dies in Maven zu erreichen, fügen Sie einen Verweis auf die Eigenschaft, die den Wert enthalten soll, in die Ressourcendatei mit der Syntax
${<property name>}
. Die Eigenschaft kann einer der in Ihrerpom.xml
definierten Werte sein, ein in densettings.xml
des Benutzers definierter Wert, eine in einer externen Eigenschaftendatei definierte Eigenschaft oder eine Systemeigenschaft.
Als Beispiel erstellen wir eine einfache info.txt
in src/main/resources
die die Pom-Version und die Erstellungszeit enthält.
Erstellen Sie eine
src/main/resources/info.txt
mit folgendem Inhalt:version = $ {pom.version} build.date = $ {timestamp}
Bitten Sie Maven , die Eigenschaften zu erweitern, indem Sie die
filtering
auf true setzen:<build> <resources> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> </resource> </resources> </build>
damit wird die Version aktualisiert, aber leider verhindert ein Fehler in Maven, dass die
${maven.build.timestamp}
an den Ressourcenfiltermechanismus übergeben wird (weitere Informationen hier ). Erstellen wir also einetimestamp
Eigenschaft als Workaround! Fügen Sie den Eigenschaften von pom Folgendes hinzu:<properties> <timestamp>${maven.build.timestamp}</timestamp> <maven.build.timestamp.format>yyyy-MM-dd'T'HH:mm</maven.build.timestamp.format> </properties>
Führen Sie maven aus, Sie sollten eine
info.txt
intarget/classes
mit einem Inhalt wie dem folgenden finden:version=0.3.2 build.date=2017-04-20T13:56
Pom.xml zur Laufzeit mit maven-model plugin lesen
Die anderen Beispiele können die beste und stabilste Methode sein, um eine Versionsnummer statisch in eine Anwendung zu übernehmen. Diese Antwort schlägt eine Alternative vor, die zeigt, wie dies dynamisch zur Laufzeit mithilfe der Maven-Modellbibliothek ausgeführt wird .
Fügen Sie die Abhängigkeit hinzu:
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-model</artifactId>
<version>3.3.9</version>
</dependency>
Erstellen MavenXpp3Reader
in Java einen MavenXpp3Reader
, um Ihr Pom zu lesen. Zum Beispiel:
package de.scrum_master.app;
import org.apache.maven.model.Model;
import org.apache.maven.model.io.xpp3.MavenXpp3Reader;
import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
import java.io.FileReader;
import java.io.IOException;
public class MavenModelExample {
public static void main(String[] args) throws IOException, XmlPullParserException {
MavenXpp3Reader reader = new MavenXpp3Reader();
Model model = reader.read(new FileReader("pom.xml"));
System.out.println(model.getId());
System.out.println(model.getGroupId());
System.out.println(model.getArtifactId());
System.out.println(model.getVersion());
}
}
Das Konsolenprotokoll lautet wie folgt:
de.scrum-master.stackoverflow:my-artifact:jar:1.0-SNAPSHOT
de.scrum-master.stackoverflow
my-artifact
1.0-SNAPSHOT