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.xmldefinierten Werte sein, ein in densettings.xmldes 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.txtmit folgendem Inhalt:version = $ {pom.version} build.date = $ {timestamp}
Bitten Sie Maven , die Eigenschaften zu erweitern, indem Sie die
filteringauf 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 einetimestampEigenschaft 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.txtintarget/classesmit 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