Apache Maven
コード内のMaven情報にアクセスする
サーチ…
前書き
コードで現在のバージョンなどの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 addDefaultImplementationEntries
のMANIFEST.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
を作成しましょう。
次の内容の
src/main/resources/info.txt
を作成します。バージョン= $ {pom.version} build.date = $ {timestamp}
filtering
をtrueに設定してプロパティを拡張するようにMavenに依頼してください:<build> <resources> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> </resource> </resources> </build>
バージョンは更新されますが、残念ながら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>
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