web-dev-qa-db-ja.com

コードでmaven pom.xmlからバージョンを取得する

コードで、つまりプログラムでmavenのpom.xmlからバージョン番号を取得する最も簡単な方法は何ですか?

214
mikhail

Javaを使用していると仮定すると、次のことができます。

  1. .propertiesファイルを(ほとんどの場合)src/main/resourcesディレクトリーに作成します(ただし、ステップ4では、他の場所を探すように指示できます)。

  2. プロジェクトバージョンの標準のMavenプロパティを使用して、.propertiesファイルの一部のプロパティの値を設定します:foo.bar=${project.version}

  3. Javaコードで、プロパティファイルの値をクラスパスのリソースとしてロードします(これを行う方法の例は豊富ですが、 スターターの例はこちら )。

  4. Mavenで、リソースフィルタリングを有効にします。これにより、Mavenはそのファイルを出力クラスにコピーし、そのコピー中にリソースを変換して、プロパティを解釈します。あなたはいくつかの情報を見つけることができます ここ しかし、あなたはほとんどあなたのpomでこれをします:

 <build> 
 <resources> 
 <resource> 
 <directory> src/main/resources </ directory> 
 <filtering> true </ filtering> 
 </ resource> 
 </ resources> 
 </ build> 

また、project.nameproject.description、またはpom <properties>などに追加する任意のプロパティなど、他の標準プロパティにアクセスすることもできます。Mavenプロファイルと組み合わせたリソースフィルタリングは、ビルド時に可変のビルド動作を提供できます。 -PmyProfileを使用して実行時にプロファイルを指定すると、ビルドで表示されるプロパティを有効にできます。

226
Alex Miller

受け入れられた答えは、アプリケーションにバージョン番号を取得するための最良かつ最も安定した方法かもしれませんstatically、しかし実際にはそうではありません元の質問に答えます:pom.xmlからアーティファクトのバージョン番号を取得する方法は?したがって、実行時に)dynamicallyを行う方法を示す代替手段を提供したいと思います。

Maven自体を使用できます。より正確には、Mavenライブラリーを使用できます。

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

そして、Javaで次のようなことを行います。

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

コンソールログは次のとおりです。

de.scrum-master.stackoverflow:my-artifact:jar:1.0-SNAPSHOT
de.scrum-master.stackoverflow
my-artifact
1.0-SNAPSHOT

2017-10-31更新: Simon Sobischのフォローアップの質問に答えるために、例を次のように変更しました。

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

パッケージ化されたアーティファクトには、コンテンツが次のようなMETA-INF/maven/${groupId}/${artifactId}/pom.propertiesファイルが含まれています。

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

多くのアプリケーションはこのファイルを使用して、実行時にアプリケーション/ jarバージョンを読み取ります。セットアップは不要です。

上記のアプローチの唯一の問題は、このファイルがpackageフェーズ中に(現在)生成されているため、テスト中などに存在しないことです(これを変更するJiraの問題があります。 MJAR-76 を参照してください) =)。これがあなたにとって問題であれば、アレックスによって説明されたアプローチが進むべき方法です。

69
Pascal Thivent

Mavenを使用してアプリのバージョン番号を表示する簡単な方法 で説明されている方法もあります。

これをpom.xmlに追加します

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

次にこれを使用します:

App.class.getPackage().getImplementationVersion()

この方法の方が簡単だとわかりました。

40
adam.lofts

@kiesteが投稿した内容を補完するために、Spring-bootを使用している場合にコードでMavenビルド情報を利用できるようにする最良の方法だと思います: http://docs.spring.io/のドキュメントspring-boot/docs/current/reference/htmlsingle /#production-ready-application-info は非常に便利です。

アクチュエータをアクティブにし、必要なプロパティをapplication.propertiesまたはapplication.ymlに追加するだけです。

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 @..@ 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]@
[email protected]@
15
coolnodje

Jarやwarなどのmvnパッケージを使用する場合は、次を使用します。

getClass().getPackage().getImplementationVersion()

アーカイブ内の生成されたMETA-INF/MANIFEST.MF(pom.xmlのバージョンに設定されている)のプロパティ「Implementation-Version」を読み取ります。

15
electrobabe

このライブラリを使用して、簡単なソリューションを簡単にします。必要に応じてマニフェストに追加し、文字列でクエリします。

 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>

this.getClass().getPackage().getImplementationVersion()を使用してバージョンを取得する

PS追加することを忘れないでください:

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