Apache Maven
Accedi a Maven informazioni nel codice
Ricerca…
introduzione
A volte è utile ottenere le proprietà di prova, come la versione corrente, nel codice. Ecco alcuni modi per farlo.
Ottenere il numero di versione da un contenitore
Se impacchettate la vostra applicazione in un jar
usando il maven-jar-plugin
o il maven-jar-plugin
maven-assembly-plugin
, un modo semplice per ottenere la versione pom attuale è aggiungere una voce nel manifest, che è poi disponibile da Java.
Il segreto è impostare il flag addDefaultImplementationEntries
su true (e l' addDefaultSpecificationEntries
è anche necessario l'id artefatto).
configurazione del plugin jar :
<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>
configurazione del plugin di assemblaggio :
<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
ordina a Maven di aggiungere le seguenti intestazioni al MANIFEST.MF
del tuo jar:
Implementation-Title: display-version
Implementation-Version: 1.0-SNAPSHOT
Implementation-Vendor-Id: test
Ora puoi usare questa linea di codice ovunque nel tuo barattolo per accedere al numero di versione:
getClass().getPackage().getImplementationVersion()
Maggiori informazioni qui e qui .
Mantenere un file di proprietà in sincronia usando il meccanismo di filtraggio delle proprietà di Maven
Come spiega questa documentazione ,
A volte un file di risorse deve contenere un valore che può essere fornito solo al momento della compilazione. Per ottenere ciò in Maven, inserisci un riferimento alla proprietà che conterrà il valore nel tuo file di risorse usando la sintassi
${<property name>}
. La proprietà può essere uno dei valori definiti inpom.xml
, un valore definito insettings.xml
dell'utente, una proprietà definita in un file di proprietà esterno o una proprietà di sistema.
Ad esempio, creiamo un semplice info.txt
in src/main/resources
contenente la versione pom e il tempo di compilazione.
creare un
src/main/resources/info.txt
con il seguente contenuto:version = $ {pom.version} build.date = $ {timestamp}
chiedi a Maven di espandere le proprietà impostando il
filtering
su true:<build> <resources> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> </resource> </resources> </build>
con questo, la versione verrà aggiornata, ma sfortunatamente un bug all'interno di Maven impedisce alla proprietà
${maven.build.timestamp}
di essere passata al meccanismo di filtraggio delle risorse (maggiori informazioni qui ). Quindi, creiamo una proprietàtimestamp
come soluzione alternativa! Aggiungi quanto segue alle proprietà del pom:<properties> <timestamp>${maven.build.timestamp}</timestamp> <maven.build.timestamp.format>yyyy-MM-dd'T'HH:mm</maven.build.timestamp.format> </properties>
esegui Maven, dovresti trovare un
info.txt
intarget/classes
con un contenuto come:version=0.3.2 build.date=2017-04-20T13:56
Lettura di un pom.xml in fase di esecuzione usando il plugin di maven-model
Gli altri esempi potrebbero essere il modo migliore e più stabile per ottenere un numero di versione in un'applicazione in modo statico . Questa risposta propone un'alternativa che mostra come farlo dinamicamente durante il runtime, usando la libreria di maven-model-maven .
Aggiungi la dipendenza:
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-model</artifactId>
<version>3.3.9</version>
</dependency>
In Java, crea un MavenXpp3Reader
per leggere il tuo pom. Per esempio:
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());
}
}
Il log della console è il seguente:
de.scrum-master.stackoverflow:my-artifact:jar:1.0-SNAPSHOT
de.scrum-master.stackoverflow
my-artifact
1.0-SNAPSHOT