Gradle에서 Spring Boot 프로젝트를 환경별로 빌드

Gradle에서 환경별로 빌드를 실행하는 방법에는 여러 가지가 있지만,
이번에는 Spring Boot의 application.properties 설정을 다시 작성한 다음 war 파일을 출력하는 방법을 소개합니다.

사용하는 개발 도구는 STS이며 Gradle Buildship이 움직이는 것으로 가정합니다.

결국 빨간색 테두리로 둘러싸인 부분이 Gradle Tasks에 추가되고,
실행하면 각각의 환경용 war 파일을 출력할 수 있게 됩니다.


준비



Spring Initializr 에서 프로젝트의 병아리를 만듭니다.
Project에서 Gradle Project를 선택하고 Packaging을 선택한 다음 Generate 버튼을 눌러 다운로드합니다.
이번에는 war를 출력하는 가정으로 움직입니다.

다운로드가 끝나면 zip 파일의 압축을 풀고
STS로 Gradle 프로젝트로 가져옵니다.

디렉토리 구성


demo
│  build.gradle                     // ここにビルドスクリプトを追加する
│  application_template.properties  // 新しく作成する
│
├─.gradle
├─.settings
├─bin
├─gradle
└─src
    ├─main
    │  ├─java
    │  │  └─com
    │  │      └─example
    │  │          └─demo
    │  │                DemoApplication.java  // 修正する
    │  │
    │  └─resources
    │          application-dev.properties     // 新しく作成する
    │          application-product.properties // 新しく作成する
    │          application.properties         // 修正する
    │
    └─test

설정 파일



Spring Boot는 application- 환경 이름 .properties라는 파일을 제공하고,
application.properties에 환경 이름을 설정하여 환경별 설정을 적용할 수 있습니다.
그렇다면 resources 아래에 다음과 같은 세 개의 파일을 준비하십시오.

application.properties
spring.profiles.active=dev

application-dev.properties
sample_data=Development Environment

application-product.properties
sample_data=Production Environment

샘플 애플리케이션



이번에는 환경별의 설정 파일의 내용을 표시한다고 하는 심플한 앱을 움직입니다.
다음과 같이 Application.java를 다시 작성합시다.

DemoApplication.java
package com.example.demo;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;

@SpringBootApplication
public class DemoApplication {

    @Value("${sample_data}")
    private String data;  // この値が設定ファイルのsample_dataの値から読み込まれる

    public static void main(String[] args) {
        ConfigurableApplicationContext ctx = SpringApplication.run(DemoApplication.class, args);
        DemoApplication demo = ctx.getBean(DemoApplication.class);
        demo.run();
    }

    private void run() {
        System.out.println(data);
    }
}

실행하면 application.properties에 설정된 파일이 로드되고 해당 환경에 맞는 값이 표시됩니다.

실행 결과 (Spring 로그는 약어)
Development Environment

빌드 스크립트 작성



이번에는 STS의 Gradle Tasks 뷰에서 환경별 태스크를 실행하여 war를 출력합니다.
우선 application.properties를 빌드 대상 환경이 설정된 것으로 대체하는 처리를 실행하도록 합니다.
다음과 같은 application.properties의 병아리 파일을 만듭니다.

application_template.properties
spring.profiles.active=${buildEnv}

그런 다음 application.properties를 병아리 파일의 ${buildEnv} 부분을 대체한 파일로 덮어쓰는 작업을 작성합니다.
build.gradle에 추가합시다.
또한 이번에는 war 명령을 사용하므로 war 명령의 설정을 기술하는 것도 잊지 않도록 해 둡시다.

build.gradle
plugins {
    // (中略)
}
// warコマンドの設定を追加
war {
    enabled = true
    archiveName 'sample.war'
}

// (中略)

// 各ファイル名
def templateFile = 'application_template.properties'
def configFile = 'application.properties'
// 対象の環境名(後に値を代入する)
def targetEnv = ''

task replaceConfig {
    description 'Replace application.properties environment.'

    doLast {
        println '    start replacing :' + targetEnv
        // コピー実行部分
        copy {
            // from: コピーするのファイルのあるディレクトリを指定する
            from '.'
            // include: 今回はコピーするファイル名を指定している
            include templateFile
            // into: コピー先のディレクトリ
            into 'src/main/resources'
            // application.propertiesにリネームする
            rename(templateFile, configFile)

            // ${buildEnv}を置き換える
            expand([
                buildEnv: targetEnv
            ])
            println "    replacing finished"
        }
    }
    // 置き換えタスクが終了したらwarコマンドでwar出力する(jarファイルならjarにする)
    finalizedBy {
        war
    }
}


이제 복사 처리 실행 후 war 태스크가 실행됩니다.
하지만 이것만으로는 아직 targetEnv의 값이 공문자이므로 설정하는 부분을 기술합니다.
더 추가합니다.

build.gradle

// (中略)

def templateFile = 'application_template.properties'
def configFile = 'application.properties'
def targetEnv = ''

task replaceConfig {
    // (中略)
}

task warProduct {
    // groupを設定することで Gradle Tasksビューのbuildの中に表示される
    group = 'build'
    description 'Create war file for product environment.'

    doLast {
        // targetEnvを設定する
        targetEnv = 'product'
    }
    // targetEnv設定後、replaceConfigタスクを実行する
    finalizedBy {
        replaceConfig
    }
}

// devもProductと同様
task warDev {
    group = 'build'
    description 'Create war file for dev environment.'

    doLast {
        targetEnv = 'dev'
    }
    finalizedBy {
        replaceConfig
    }

}

각 태스크 내에서 targetEnv를 설정한 후 replaceConfig 태스크를 실행하도록 작성했습니다.
이제 작동해야합니다.
다음은 노컷 버전입니다.

build.gradle
plugins {
    id 'org.springframework.boot' version '2.1.9.RELEASE'
    id 'io.spring.dependency-management' version '1.0.8.RELEASE'
    id 'java'
    id 'war'
}
war {
    enabled = true
    archiveName 'sample.war'
}

group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

// 各ファイル名
def templateFile = 'application_template.properties'
def configFile = 'application.properties'
// 対象の環境名(後に値を代入する)
def targetEnv = ''

task replaceConfig {
    description 'Replace application.properties environment.'

    doLast {
        println '    start replacing :' + targetEnv
        // コピー実行部分
        copy {
            // from: コピーするのファイルのあるディレクトリを指定する
            from '.'
            // include: 今回はコピーするファイル名を指定している
            include templateFile
            // コピー先のディレクトリ
            into 'src/main/resources'
            // application.propertiesにリネームする
            rename(templateFile, configFile)

            // application_template内の${buildEnv}を置き換える
            expand([
                buildEnv: targetEnv
            ])
            println "    replacing finished"
        }
    }
    // 置き換えタスクが終了したらwarコマンドでwar出力する
    finalizedBy {
        war
    }
}

task warProduct {
    // groupを設定することで Gradle Tasksビューのbuildの中に表示される
    group = 'build'
    description 'Create war file for product environment.'

    doLast {
        // targetEnvを設定する
        targetEnv = 'product'
    }
    // targetEnv設定後、replaceConfigタスクを実行する
    finalizedBy {
        replaceConfig
    }
}

// devもProductと同様
task warDev {
    group = 'build'
    description 'Create war file for dev environment.'

    doLast {
        targetEnv = 'dev'
    }
    finalizedBy {
        replaceConfig
    }
}

이것으로 완성입니다.
Gradle Tasks에서 warDev 또는 warProduct를 실행하면 build/lib 내에 war 파일이 작성됩니다.
war를 압축 해제하고 그 안의 application.properties를 확인하면 각 환경의 설정이되어 있어야합니다.

좋은 웹페이지 즐겨찾기