Apache Maven
Få tillgång till Maven-information i kod
Sök…
Introduktion
Det är ibland användbart att få mavenegenskaperna, som den aktuella versionen, i kod. Här är några sätt att göra det.
Hämta versionnumret från en burk
Om du paketerar din applikation i en jar
med maven-jar-plugin
eller maven-assembly-plugin
, är ett enkelt sätt att få den aktuella pom-versionen att lägga till en post i manifestet, som sedan är tillgängligt från Java.
Hemligheten är att ställa in addDefaultImplementationEntries
flaggan till true (och addDefaultSpecificationEntries
är att du också behöver artefakt-ID).
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>
montering 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
instruerar Maven att lägga till följande rubriker till MANIFEST.MF
i din burk:
Implementation-Title: display-version
Implementation-Version: 1.0-SNAPSHOT
Implementation-Vendor-Id: test
Nu kan du använda den här kodraden var som helst i din burk för att få åtkomst till versionnumret:
getClass().getPackage().getImplementationVersion()
Håller en fastighetsfil synkroniserad med Maven's egendomsfiltreringsmekanism
Som dokumentationen förklarar,
Ibland måste en resursfil innehålla ett värde som endast kan levereras vid byggtid. För att uppnå detta i Maven, lägg en hänvisning till den egenskap som kommer att innehålla värdet i din resursfil med syntaxen
${<property name>}
. Egenskapen kan vara ett av värdena som definieras i dinpom.xml
, ett värde som definieras i användarenssettings.xml
, en egenskap som definieras i en extern egenskaperfil eller en systemegenskap.
Låt oss som exempel skapa en enkel info.txt
i src/main/resources
innehåller pom-versionen och byggtiden.
skapa en
src/main/resources/info.txt
med följande innehåll:version = $ {pom.version} build.date = $ {timestamp}
be Maven att utöka egenskaperna genom att ställa in
filtering
till true:<build> <resources> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> </resource> </resources> </build>
med det kommer versionen att uppdateras, men tyvärr förhindrar ett fel i Maven att egenskapen
${maven.build.timestamp}
överförs till resursfiltreringsmekanismen (mer information här ). Så låt oss skapa entimestamp
som en lösning! Lägg till följande i poms egenskaper:<properties> <timestamp>${maven.build.timestamp}</timestamp> <maven.build.timestamp.format>yyyy-MM-dd'T'HH:mm</maven.build.timestamp.format> </properties>
kör maven, du bör hitta ett
info.txt
itarget/classes
med ett innehåll som:version=0.3.2 build.date=2017-04-20T13:56
Läser en pom.xml under körning med plugin för maven-modell
De andra exemplen kan vara det bästa och mest stabila sättet att få ett versionsnummer till en applikation statiskt . Detta svar föreslår ett alternativ som visar hur man gör det dynamiskt under körning med hjälp av biblioteket maven maven-model .
Lägg till beroendet:
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-model</artifactId>
<version>3.3.9</version>
</dependency>
MavenXpp3Reader
en MavenXpp3Reader
att läsa din pom. Till exempel:
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());
}
}
Konsolloggen är som följer:
de.scrum-master.stackoverflow:my-artifact:jar:1.0-SNAPSHOT
de.scrum-master.stackoverflow
my-artifact
1.0-SNAPSHOT