@Valueアノテーションを使用してSpring Bootアプリケーションでmaven project.versionプロパティを取得する方法は?
Spring BootアプリケーションでMavenプロジェクトバージョンを取得する方法についてのいくつかの調査と試用の後、私のために機能するものは見つかりませんでした。
マニフェストの使用は、クラスローダーの問題のために間違いなく腐ったパスです。つまり、Springが最初に発見したマニフェストを取得します。
私が見つけた解決策の1つは、mavenリソースプラグインを使用して、リソースファイルのプロパティを「フィルター」(置換)することです。この場合、Spring application.properties
。
この作業を行う手順は次のとおりです。
Pomで、次の定義を使用してリソースフィルタリングをアクティブにします。
<resources>
<resource>
<filtering>true</filtering>
<directory>src/main/resources</directory>
<includes>
<include>application.properties</include>
</includes>
</resource>
</resources>
application.properties
ファイル内:
[email protected]@
[email protected]@
build.timestamp=@timestamp@
application.properties
ファイルの$ {property}。の代わりに@ property @に注意してください。
Spring-boot-starter-parent pomは、標準の$ {}区切り文字を@として再定義します。
<resource.delimiter>@</resource.delimiter> <!-- delimiter that doesn't clash with Spring ${} placeholders -->
<delimiters>
<delimiter>${resource.delimiter}</delimiter>
</delimiters>
次に、次のように@Valueを使用して、Springでこれらのプロパティにアクセスできます。
@Value("${application.name}")
private String applicationName;
@Value("${build.version}")
private String buildVersion;
@Value("${build.timestamp}")
private String buildTimestamp;
Spring Boot applicationでMavenプロパティにアクセスするには、次のように@
の区切り文字application.properties
でそれらをマップするだけです。
[email protected]@
[email protected]@
次に、通常のプロパティのようにアプリでそれらを使用します。例:
@Service
public class SomeService {
@Value("${app.version}")
private String appVersion;
// other stuff
}
ソース: Mavenを使用した自動プロパティ展開
ただし、アプリケーションプロパティを格納するためにyamlを使用している場合、デリミタ@
を他のもの、たとえば^
をpom.xml
に置き換える必要があります。
<plugin>
<groupId>org.Apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>2.7</version>
<configuration>
<delimiters>
<delimiter>^</delimiter>
</delimiters>
<useDefaultDelimiters>false</useDefaultDelimiters>
</configuration>
</plugin>
またはもっと簡単-pom.xmlのpropeties
ブロック内の変数resource.delimiter
を置き換えるだけです:
<properties>
<Java.version>11</Java.version>
<resource.delimiter>^</resource.delimiter>
</properties>
次に、application.yml
で使用します。
app:
version: ^project.version^
name: ^project.name^
これを行う簡単な方法があります。application.propertiesや区切り文字の変更を追加する必要はありません。目標build-infoでプラグインを追加し、Bean BuildPropertiesでAutowire起動クラスを追加するだけです。
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.1.3.RELEASE</version>
<executions>
<execution>
<goals>
<goal>build-info</goal>
</goals>
</execution>
</executions>
</plugin>
スタートアップクラスには
@Autowired
BuildProperties buildProperties;
後の@PostConstructでは、複数のメソッドを呼び出して、ビルドのタイムスタンプ、バージョン、名前、アーティファクトなどを取得できます。
buildProperties.getName();
buildProperties.getVersion();
buildProperties.get("time");
info
アクチュエーターは、自動的にこの情報を使用し、それを検出した場合はこの情報を表示し、見つかった場合は git information を表示します。
これはおそらく、メインのpomがspring-boot-starter-parentを親pomとして宣言していないためです。その場合、フィルタリングはデフォルトで行われ、明示的にフィルタリングを宣言する必要はありません。
私からの変更:
<parent>
<groupId>com.mycompany</groupId>
<artifactId>mycompany-parent</artifactId>
<version>20</version>
</parent>
に:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.6.RELEASE</version>
</parent>
私のアプリケーションでは、pom.xmlはフィルタリングを宣言することなく問題を修正しました。