回答:
Javaを使用している場合、次のことができます。
.properties
(最も一般的には)src/main/resources
ディレクトリにファイルを作成します(ただし、ステップ4で他の場所を探すように指示することができます)。
.properties
プロジェクトバージョンの標準のMavenプロパティを使用して、ファイル内のいくつかのプロパティの値を設定します。 foo.bar=${project.version}
Javaコードで、クラスパスからリソースとしてプロパティファイルから値をロードします(これを行う方法の豊富な例についてはGoogleが、スターターの例を示します)。
Mavenでリソースフィルタリングを有効にします。これにより、Mavenはそのファイルを出力クラスにコピーし、そのコピー中にリソースを変換して、プロパティを解釈します。あなたはここにいくつかの情報を見つけることができますが、ほとんどの場合あなたのポンでこれを行います:
<ビルド> <資料> <リソース> <directory> src / main / resources </ directory> <filtering> true </ filtering> </リソース> </ resources> </ビルド>
また、のような他の標準的な特性のために取得することができproject.name
、project.description
あなたはあなたのポンポンに入れたり、任意のプロパティ<properties>
、Mavenのプロファイルと組み合わせるなど、リソースフィルタリングは、あなたのビルド時に変数のビルドの振る舞いを与えることができます。を使用して実行時にプロファイルを指定すると-PmyProfile
、ビルドで表示されるプロパティを有効にできます。
src/main/resources
バイナリファイルを含め、このディレクトリにあるすべてのファイルを処理する可能性があるため、で直接フィルタリングを使用する場合は注意してください。予測できない動作を回避するにはsrc/main/resources-filtered
、ここで提案されているように、ディレクトリでフィルタリングを行うことをお勧めします。とにかく、この素敵なトリックをありがとう!
受け入れられた答えは、バージョン番号をアプリケーションに静的に取り込むための最良かつ最も安定した方法である可能性がありますが、実際には元の質問に答えません:pom.xmlからアーティファクトのバージョン番号を取得する方法?したがって、実行時に動的に行う方法を示す別の方法を提供したいと思います。
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());
}
}
package
のmaven-組立・プラグインでパッケージ化するときDジャー(依存クラスが統合されていない)と動作しませんjar-with-dependencies
I GET a java.io.FileNotFoundException: pom.xml
(それはとして最終的なjarにありますMETA-INF/maven/my.package/myapp/pom.xml
)-これを解決する方法のヒントはありますか?
パッケージ化されたアーティファクトには、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
多くのアプリケーションがこのファイルを使用して、実行時にapplication / jarバージョンを読み取ります。セットアップは必要ありません。
上記のアプローチの唯一の問題は、このファイルが(現在)package
フェーズ中に生成され、テスト中に存在しないことです(これを変更するためのJiraの問題があります。MJAR-76を参照してください)。これがあなたにとって問題であるならば、アレックスによって説明されたアプローチは行くべき道です。
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()
この方法の方が簡単であることがわかりました。
getImplementationVersion()
でしたnull
。(mavenバージョン3.0.4)
.war
成果物、使用することを忘れないmaven-war-plugin
代わりにmaven-jar-plugin
getImplementationVersion()
nullを返します)。
@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
info.build.artifact=@project.artifactId@
info.build.name=@project.name@
info.build.description=@project.description@
info.build.version=@project.version@
このライブラリを使用すると、簡単なソリューションが簡単になります。必要なものをマニフェストに追加し、文字列でクエリします。
System.out.println("JAR was created by " + Manifests.read("Created-By"));
リポジトリからURLを介してアーティファクトを取得する場合など、プロジェクトバージョンに関連する何かをスクリプト化する場合、Mavenコマンドラインで十分な場合があります。
mvn help:evaluate -Dexpression=project.version -q -DforceStdout
使用例:
VERSION=$( mvn help:evaluate -Dexpression=project.version -q -DforceStdout )
ARTIFACT_ID=$( mvn help:evaluate -Dexpression=project.artifactId -q -DforceStdout )
GROUP_ID_URL=$( mvn help:evaluate -Dexpression=project.groupId -q -DforceStdout | sed -e 's#\.#/#g' )
curl -f -S -O http://REPO-URL/mvn-repos/${GROUP_ID_URL}/${ARTIFACT_ID}/${VERSION}/${ARTIFACT_ID}-${VERSION}.jar
<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>
ketankkの答えを参照して:
残念ながら、これを追加すると、アプリケーションがリソースをどのように処理したかがわかりません。
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</build>
しかし、これをmaven-assemble-pluginの<manifest>タグ内で使用することでうまくいきました:
<addDefaultImplementationEntries>true</addDefaultImplementationEntries>
<addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
だから私は使用してバージョンを取得することができました
String version = getClass().getPackage().getImplementationVersion();