サーチ…


前書き

コードで現在のバージョンなどのmavenプロパティを取得すると便利なことがあります。ここにいくつかの方法があります。

jarファイルからのバージョン番号の取得

maven-jar-pluginまたはmaven-assembly-pluginを使用してjarファイルにアプリケーションをパッケージ化する場合、現在のpomバージョンを取得する簡単な方法は、マニフェストにエントリを追加することです。

秘密は、 addDefaultImplementationEntriesフラグをtrueに設定することです( addDefaultSpecificationEntriesはアーティファクトIDも必要です)。

jarプラグインの設定

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

アセンブリプラグインの設定

<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はMavenにあなたのjar addDefaultImplementationEntriesMANIFEST.MFに以下のヘッダを追加するよう指示します:

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

これで、あなたのjarのどこにでもこのコード行を使って、バージョン番号にアクセスすることができます:

getClass().getPackage().getImplementationVersion()

詳細はこちらこちらをご覧ください

Mavenのプロパティフィルタリングを使用してプロパティファイルを同期させて維持する

このドキュメントで説明するように、

リソースファイルには、ビルド時にのみ指定できる値が必要な場合があります。これをMavenで行うには、 ${<property name>}構文を使用して、値を含むプロパティへの参照をリソースファイルに入れます。このプロパティは、 pom.xmlで定義された値、ユーザーのsettings.xmlで定義された値、外部プロパティファイルで定義されたプロパティ、またはシステムプロパティのいずれかです。

例として、pomのバージョンとビルド時間を含むsrc/main/resources単純なinfo.txtを作成しましょう。

  1. 次の内容のsrc/main/resources/info.txtを作成します。

    バージョン= $ {pom.version} build.date = $ {timestamp}

  2. filteringをtrueに設定てプロパティを拡張するようにMavenに依頼してください:

     <build>
         <resources>
             <resource>
                <directory>src/main/resources</directory>
                <filtering>true</filtering>
             </resource>
         </resources>
     </build>
    
  3. バージョンは更新されますが、残念ながらMaven内のバグは${maven.build.timestamp}プロパティがリソースフィルタリングメカニズム(詳細はこちら )に渡されるのを防ぎます。だから、回避策としてtimestampプロパティを作成しましょう!ポームのプロパティに以下を追加します。

     <properties>
         <timestamp>${maven.build.timestamp}</timestamp>
         <maven.build.timestamp.format>yyyy-MM-dd'T'HH:mm</maven.build.timestamp.format>  
     </properties>
    
  4. mavenを実行すると、 target/classes内にinfo.txtという内容のコンテンツがあります:

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

実行時にmaven-modelプラグインを使用してpom.xmlを読み込む

他の例は、アプリケーションバージョン番号を静的に取得するための最良で最も安定した方法です。 この回答は、Maven Mavenモデルライブラリを使用して、ランタイム中に動的に行う方法を示す代替案を提案しています

依存関係を追加する:

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

Javaでは、 MavenXpp3Readerを読み込むMavenXpp3Readerを作成します。例えば:

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

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

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
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow