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 uw pom.xml , een waarde die is gedefinieerd in de settings.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.

  1. maak een src/main/resources/info.txt met de volgende inhoud:

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

  2. 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>
    
  3. 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 een timestamp 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>
    
  4. voer maven uit, u zou een info.txt in target/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


Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow