web-dev-qa-db-ja.com

@ValueでSpringアプリケーションのmaven project.versionプロパティを取得できません

@Valueアノテーションを使用してSpring Bootアプリケーションでmaven project.versionプロパティを取得する方法は?

34
Jack G.

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;

サンプルプロジェクトはここから入手できます

67
Jack G.

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^
21
Cepr0

これを行う簡単な方法があります。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 を表示します。

6
Milan Desai

これはおそらく、メインの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はフィルタリングを宣言することなく問題を修正しました。

1
TheBakker