Spring Bootによるプロパティの自動拡張

Spring Bootによる自動プロパティ拡張

1. 概要

この記事では、SpringがMavenおよびGradleビルドメソッドを介して提供するプロパティ拡張メカニズムについて説明します。

2. メーベン

2.1. デフォルト設定

spring-boot-starter-parentを使用するMavenプロジェクトの場合、プロパティ拡張を利用するために追加の構成は必要ありません。


    org.springframework.boot
    spring-boot-starter-parent
    1.5.4.RELEASE

これで、@…@プレースホルダーを使用してプロジェクトのプロパティを展開できます。 Mavenから取得したプロジェクトのバージョンをプロパティに保存する方法の例を次に示します。

[email protected]@
[email protected]@

これらの拡張は、これらのパターンに一致する構成ファイル内でのみ使用できます。

  • */application.yml

  • */application.yaml

  • */application.properties

2.2. 手動設定

spring-boot-starter-parentの親がない場合は、このフィルタリングと拡張を手動で構成する必要があります。 pom.xmlファイルの<build>セクションにresources要素を含める必要があります。


    
        ${basedir}/src/main/resources
        true
        
            **/application*.yml
            **/application*.yaml
            **/application*.properties
         
    

そして<plugins>で:


    org.apache.maven.plugins
    maven-resources-plugin
    2.7
    
        
            @
        
        false
    

タイプ$\{variable.name}の標準プレースホルダーを使用する必要がある場合は、useDefaultDelimeterstrueに設定する必要があり、application.propertiesは次のようになります。

expanded.project.version=${project.version}
expanded.project.property=${custom.property}

3. Gradle

3.1. 標準のGradleソリューション

Spring BootドキュメントのGradlesolutionは、Mavenプロパティのフィルタリングおよび拡張と100%互換性がありません。

プロパティ拡張メカニズムを使用できるようにするには、次のコードをbuild.gradleに含める必要があります。

processResources {
    expand(project.properties)
}

これは限定的なソリューションであり、Mavenのデフォルト設定とは次の違いがあります。

  1. ドット付きのプロパティはサポートしていません(例: user.name). Gradleは、ドットをオブジェクトプロパティの区切り文字として理解します

  2. 特定の構成ファイルのセットだけでなく、すべてのリソースファイルをフィルターします。

  3. デフォルトのドル記号プレースホルダー$\{…}を使用するため、標準のSpringプレースホルダーと競合します

3.2. Maven互換ソリューション

標準のMavenソリューションを複製し、@…@スタイルのプレースホルダーを利用するには、次のコードをbuild.gradleに追加する必要があります。

import org.apache.tools.ant.filters.ReplaceTokens
processResources {
    with copySpec {
        from 'src/main/resources'
        include '**/application*.yml'
        include '**/application*.yaml'
        include '**/application*.properties'
        project.properties.findAll().each {
          prop ->
            if (prop.value != null) {
                filter(ReplaceTokens, tokens: [ (prop.key): prop.value])
                filter(ReplaceTokens, tokens: [ ('project.' + prop.key): prop.value])
            }
        }
    }
}

これにより、プロジェクトのすべてのプロパティが解決されます。 プロパティをドットで定義することはまだできません(例: user.name) in the build.gradle, but now we can use gradle.properties file to define properties in the standard Java properties format, and it also supports properties with dots (e.g database.url).

このビルドは、すべてのリソースではなく、プロジェクト構成ファイルのみをフィルタリングし、Mavenソリューションと100%互換性があります。

4. 結論

このクイックチュートリアルでは、MavenとGradleの両方のビルドメソッドを使用してSpring Bootプロパティを自動的に展開する方法と、一方から他方に簡単に移行する方法について説明しました。

完全なソースの例はover on GitHubにあります。