web-dev-qa-db-ger.com

Rufen Sie die Version aus maven pom.xml im Code ab

Was ist der einfachste Weg, um die Versionsnummer aus mavens pom.xml im Code abzurufen, d. H. Programmgesteuert?

196
mikhail

Vorausgesetzt, Sie verwenden Java, können Sie

  1. Erstellen Sie eine .properties-Datei in (meistens) Ihrem src/main/resources-Verzeichnis (aber in Schritt 4 können Sie sie anweisen, woanders nachzuschauen).

  2. Legen Sie den Wert einer Eigenschaft in Ihrer .properties-Datei mithilfe der Maven-Standardeigenschaft für die Projektversion fest: foo.bar=${project.version}

  3. Laden Sie in Ihrem Java-Code den Wert aus der Eigenschaftendatei als Ressource aus dem Klassenpfad (google bietet zahlreiche Beispiele dafür, aber hier ein Beispiel für Einsteiger ).

  4. Aktivieren Sie in Maven die Ressourcenfilterung. Dies bewirkt, dass Maven diese Datei in Ihre Ausgabeklassen kopiert und die Ressource während dieser Kopie übersetzt, wobei die Eigenschaft interpretiert wird. Sie können einige Informationen hier finden, aber Sie tun dies meistens nur in Ihrem Pom:

 <build> 
 <Ressourcen> 
 <Ressource> 
 <Verzeichnis> src/main/resources </ verzeichnis> 
 <filter> true </ filter> 
 </ resource> 
 </ resources> 
 </ build> 

Sie können auch auf andere Standardeigenschaften wie project.name, project.description oder sogar auf beliebige Eigenschaften, die Sie in Ihr pom <properties> eingeben, usw. zugreifen. Durch die Ressourcenfilterung in Kombination mit Maven-Profilen kann das Build-Verhalten der Variablen variieren. Wenn Sie zur Laufzeit mit -PmyProfile ein Profil angeben, können Eigenschaften aktiviert werden, die dann in Ihrem Build angezeigt werden können.

213
Alex Miller

Paketierte Artefakte enthalten eine META-INF/maven/${groupId}/${artifactId}/pom.properties-Datei, deren Inhalt wie folgt aussieht:

#Generated by Maven
#Sun Feb 21 23:38:24 GMT 2010
version=2.5
groupId=commons-lang
artifactId=commons-lang

Viele Anwendungen verwenden diese Datei, um die Version der Anwendung/JAR zur Laufzeit zu lesen. Es ist kein Setup erforderlich.

Das einzige Problem bei der obigen Vorgehensweise ist, dass diese Datei (derzeit) während der package-Phase erstellt wird und daher während Tests usw. nicht vorhanden ist (es gibt ein Problem mit Jira, um dies zu ändern, siehe MJAR-76 ). Wenn dies ein Problem für Sie ist, ist der von Alex beschriebene Ansatz der richtige Weg. 

67
Pascal Thivent

Die akzeptierte Antwort ist möglicherweise die beste und stabilste Methode, um eine Versionsnummer in eine Anwendung zu importieren statisch, beantwortet jedoch nicht die ursprüngliche Frage: Wie kann ich die Versionsnummer des Artefakts von pom abrufen? xml? Daher möchte ich eine Alternative anbieten, die zeigt, wie das geht. Dynamisch zur Laufzeit:

Sie können Maven selbst verwenden. Genauer gesagt, können Sie eine Maven-Bibliothek verwenden.

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

Und dann etwas in Java machen:

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 Application {
    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

Update 2017-10-31: Um die Folgefrage von Simon Sobisch zu beantworten, habe ich das Beispiel folgendermaßen geändert:

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.File;
import Java.io.FileReader;
import Java.io.IOException;
import Java.io.InputStreamReader;

public class Application {
  public static void main(String[] args) throws IOException, XmlPullParserException {
    MavenXpp3Reader reader = new MavenXpp3Reader();
    Model model;
    if ((new File("pom.xml")).exists())
      model = reader.read(new FileReader("pom.xml"));
    else
      model = reader.read(
        new InputStreamReader(
          Application.class.getResourceAsStream(
            "/META-INF/maven/de.scrum-master.stackoverflow/aspectj-introduce-method/pom.xml"
          )
        )
      );
    System.out.println(model.getId());
    System.out.println(model.getGroupId());
    System.out.println(model.getArtifactId());
    System.out.println(model.getVersion());
  }
}
65
kriegaex

Es gibt auch die in Einfache Methode zum Anzeigen der Versionsnummer Ihrer Apps mithilfe von Maven :

Fügen Sie dies zu pom.xml hinzu

<build>
  <plugins>
    <plugin>
      <groupId>org.Apache.maven.plugins</groupId>
      <artifactId>maven-jar-plugin</artifactId>
      <configuration>
        <archive>
          <manifest>
            <mainClass>test.App</mainClass>
            <addDefaultImplementationEntries>
              true
            </addDefaultImplementationEntries>
          </manifest>
        </archive>
      </configuration>
    </plugin>
  </plugins>
</build>

Dann benutze folgendes:

App.class.getPackage().getImplementationVersion()

Ich habe festgestellt, dass diese Methode einfacher ist.

39
adam.lofts

Um zu ergänzen, was @kieste gepostet hat, ist es meiner Meinung nach der beste Weg, um Maven-Build-Informationen in Ihrem Code zu haben, wenn Sie Spring-boot verwenden: die Dokumentation unter http://docs.spring.io/spring- boot/docs/current/reference/htmlsingle/# production-ready-application-info ist sehr nützlich.

Sie müssen lediglich Aktuatoren aktivieren und die gewünschten Eigenschaften in Ihren application.properties oder application.yml einfügen.

Automatic property expansion using Maven

You can automatically expand info properties from the Maven project using resource filtering. If you use the spring-boot-starter-parent you can then refer to your Maven ‘project properties’ via @[email protected] placeholders, e.g.

project.artifactId=myproject
project.name=Demo
project.version=X.X.X.X
project.description=Demo project for info endpoint
[email protected]@
[email protected]@
[email protected]@
info.build[email protected]@
15
coolnodje

Wenn Sie mvn-Verpackungen wie Glas oder Krieg verwenden, verwenden Sie:

getClass().getPackage().getImplementationVersion()

Es liest eine Eigenschaft "Implementation-Version" des generierten META-INF/MANIFEST.MF (die auf die Version von pom.xml gesetzt ist) im Archiv.

13
electrobabe

Verwenden Sie diese Bibliothek, um eine einfache Lösung zu erhalten. Fügen Sie dem Manifest hinzu, was Sie benötigen, und fragen Sie die Zeichenfolge ab.

 System.out.println("JAR was created by " + Manifests.read("Created-By"));

http://manifests.jcabi.com/index.html

6
feder
    <build>
            <finalName>${project.artifactId}-${project.version}</finalName>
            <pluginManagement>
                <plugins>
                    <plugin>
                        <groupId>org.Apache.maven.plugins</groupId>
                        <artifactId>maven-war-plugin</artifactId>
                        <version>3.2.2</version>
                        <configuration>
                            <failOnMissingWebXml>false</failOnMissingWebXml>
                            <archive>
                                <manifest>
                                    <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
                                    <addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
                                </manifest>
                            </archive>
                        </configuration>
                    </plugin>
                 </plugins>
            </pluginManagement>
</build>

Version abrufen mit this.getClass().getPackage().getImplementationVersion()

PS Vergiss nicht hinzuzufügen:

<manifest>
    <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
    <addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
</manifest>
0
Ketan Keshri