Suche…


Einführung

Es ist manchmal nützlich, die Maven-Eigenschaften, z. B. die aktuelle Version, im Code abzurufen. Hier sind einige Möglichkeiten dazu.

Die Versionsnummer aus einem Glas holen

Wenn Sie Ihre Anwendung mit dem maven-jar-plugin oder dem maven-assembly-plugin in ein jar maven-jar-plugin , können Sie zur aktuellen Pom-Version einfach einen Eintrag im Manifest hinzufügen, der dann in Java verfügbar ist.

Das Geheimnis besteht darin, das Flag addDefaultImplementationEntries auf true zu setzen (und bei addDefaultSpecificationEntries ist auch die Artefakt-ID erforderlich).

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>

Assembly 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 weist Maven die folgenden Header an den hinzufügen MANIFEST.MF Ihrer jar:

Implementation-Title: display-version
Implementation-Version: 1.0-SNAPSHOT
Implementation-Vendor-Id: test

Jetzt können Sie diese Codezeile überall in Ihrem Jar verwenden, um auf die Versionsnummer zuzugreifen:

getClass().getPackage().getImplementationVersion()

Mehr Informationen hier und hier .

Synchronisieren einer Eigenschaftendatei mithilfe der Eigenschaftsfilterung von maven

Wie diese Dokumentation erklärt,

Manchmal muss eine Ressourcendatei einen Wert enthalten, der nur zur Erstellungszeit angegeben werden kann. Um dies in Maven zu erreichen, fügen Sie einen Verweis auf die Eigenschaft, die den Wert enthalten soll, in die Ressourcendatei mit der Syntax ${<property name>} . Die Eigenschaft kann einer der in Ihrer pom.xml definierten Werte sein, ein in den settings.xml des Benutzers definierter Wert, eine in einer externen Eigenschaftendatei definierte Eigenschaft oder eine Systemeigenschaft.

Als Beispiel erstellen wir eine einfache info.txt in src/main/resources die die Pom-Version und die Erstellungszeit enthält.

  1. Erstellen Sie eine src/main/resources/info.txt mit folgendem Inhalt:

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

  2. Bitten Sie Maven , die Eigenschaften zu erweitern, indem Sie die filtering auf true setzen:

     <build>
         <resources>
             <resource>
                <directory>src/main/resources</directory>
                <filtering>true</filtering>
             </resource>
         </resources>
     </build>
    
  3. damit wird die Version aktualisiert, aber leider verhindert ein Fehler in Maven, dass die ${maven.build.timestamp} an den Ressourcenfiltermechanismus übergeben wird (weitere Informationen hier ). Erstellen wir also eine timestamp Eigenschaft als Workaround! Fügen Sie den Eigenschaften von pom Folgendes hinzu:

     <properties>
         <timestamp>${maven.build.timestamp}</timestamp>
         <maven.build.timestamp.format>yyyy-MM-dd'T'HH:mm</maven.build.timestamp.format>  
     </properties>
    
  4. Führen Sie maven aus, Sie sollten eine info.txt in target/classes mit einem Inhalt wie dem folgenden finden:

     version=0.3.2
     build.date=2017-04-20T13:56
    

Pom.xml zur Laufzeit mit maven-model plugin lesen

Die anderen Beispiele können die beste und stabilste Methode sein, um eine Versionsnummer statisch in eine Anwendung zu übernehmen. Diese Antwort schlägt eine Alternative vor, die zeigt, wie dies dynamisch zur Laufzeit mithilfe der Maven-Modellbibliothek ausgeführt wird .

Fügen Sie die Abhängigkeit hinzu:

<dependency>
  <groupId>org.apache.maven</groupId>
  <artifactId>maven-model</artifactId>
  <version>3.3.9</version>
</dependency>

Erstellen MavenXpp3Reader in Java einen MavenXpp3Reader , um Ihr Pom zu lesen. Zum Beispiel:

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

Das Konsolenprotokoll lautet wie folgt:

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
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow