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()

Mer information här och här .

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 din pom.xml , ett värde som definieras i användarens settings.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.

  1. skapa en src/main/resources/info.txt med följande innehåll:

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

  2. 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>
    
  3. 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 en timestamp 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>
    
  4. kör maven, du bör hitta ett info.txt i target/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


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow