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 in pom.xml , un valore definito in settings.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.

  1. creare un src/main/resources/info.txt con il seguente contenuto:

    version = $ {pom.version} build.date = $ {timestamp}

  2. 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>
    
  3. 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>
    
  4. esegui Maven, dovresti trovare un info.txt in target/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


Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow