Apache Maven
Toegang tot Maven-informatie in code
Zoeken…
Invoering
Het is soms handig om de maven-eigenschappen, zoals de huidige versie, in code te krijgen. Hier zijn enkele manieren om er naartoe te gaan.
Het versienummer uit een pot halen
Als u uw toepassing in een jar
maven-jar-plugin
met behulp van de maven-jar-plugin
of de maven-assembly-plugin
, is een eenvoudige manier om de huidige pom-versie te krijgen een vermelding in het manifest toe te voegen, die vervolgens beschikbaar is via Java.
Het geheim is om de vlag addDefaultImplementationEntries
te stellen op true (en de addDefaultSpecificationEntries
is dat u ook de artefact-id nodig hebt).
jar plugin configuratie :
<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>
configuratie configuratie plugin :
<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
geeft Maven opdracht om de volgende headers toe te voegen aan de MANIFEST.MF
van uw pot:
Implementation-Title: display-version
Implementation-Version: 1.0-SNAPSHOT
Implementation-Vendor-Id: test
Nu kunt u deze coderegel overal in uw pot gebruiken om toegang te krijgen tot het versienummer:
getClass().getPackage().getImplementationVersion()
Meer informatie hier en hier .
Een eigenschappenbestand gesynchroniseerd houden met behulp van maven's eigenschappenfilterend mechanisme
Zoals deze documentatie verklaart,
Soms moet een bronbestand een waarde bevatten die alleen tijdens het bouwen kan worden geleverd. Om dit in Maven te bereiken, plaatst u een verwijzing naar de eigenschap die de waarde in uw resource-bestand zal bevatten met behulp van de syntaxis
${<property name>}
. De eigenschap kan een van de waarden zijn die zijn gedefinieerd in uwpom.xml
, een waarde die is gedefinieerd in desettings.xml
de gebruiker.xml, een eigenschap die is gedefinieerd in een extern eigenschappenbestand of een systeemeigenschap.
Laten we als voorbeeld een eenvoudige info.txt
in src/main/resources
met de pom-versie en de bouwtijd.
maak een
src/main/resources/info.txt
met de volgende inhoud:version = $ {pom.version} build.date = $ {timestamp}
vraag Maven om de eigenschappen uit te breiden door
filtering
te stellen op true:<build> <resources> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> </resource> </resources> </build>
daarmee wordt de versie bijgewerkt, maar helaas voorkomt een bug in Maven dat de eigenschap
${maven.build.timestamp}
wordt doorgegeven aan het${maven.build.timestamp}
(meer informatie hier ). Laten we dus eentimestamp
eigenschap maken als oplossing! Voeg het volgende toe aan de eigenschappen van de pom:<properties> <timestamp>${maven.build.timestamp}</timestamp> <maven.build.timestamp.format>yyyy-MM-dd'T'HH:mm</maven.build.timestamp.format> </properties>
voer maven uit, u zou een
info.txt
intarget/classes
moeten vinden met een inhoud zoals:version=0.3.2 build.date=2017-04-20T13:56
Een pom.xml lezen tijdens runtime met behulp van de maven-model plug-in
De andere voorbeelden kunnen de beste en meest stabiele manier zijn om een versienummer statisch in een toepassing te krijgen. Dit antwoord stelt een alternatief voor dat laat zien hoe het dynamisch te doen tijdens runtime, met behulp van de maven maven-modelbibliotheek .
Voeg de afhankelijkheid toe:
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-model</artifactId>
<version>3.3.9</version>
</dependency>
Maak in Java een MavenXpp3Reader
om je pom te lezen. Bijvoorbeeld:
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());
}
}
Het consolelogboek is als volgt:
de.scrum-master.stackoverflow:my-artifact:jar:1.0-SNAPSHOT
de.scrum-master.stackoverflow
my-artifact
1.0-SNAPSHOT