SpringBootをGradleでビルド

SpringBootのプロジェクトを作ってGradleでビルドしてみる

作り方は公式のサイトにのっています。プロジェクトの作成方法としてSTSを使った方法とサンプルのソースをダウンロードしてきて使う方法があります。開発環境としてEclipseではなくInteliJを使いたいので、サンプルのソースを参考にspring bootのプロジェクトを作成して見たいと思います。

公式の手順ではこちらのソースをダウンロードした後にInteliJでcompleteフォルダをgradleプロジェクトとして読み込み、後はコントローラにリクエストを飛ばしてspring bootが動いていることを確認しています。

サンプルのソースを参考にspring bootのプロジェクトを作ってみる

InteliJでgradleのプロジェクトを作成後、build.gradleの設定を以下のようにします。

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:2.0.3.RELEASE")
    }
}

apply plugin: 'java'
apply plugin: 'idea'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'

bootJar {
    baseName = 'spring_test'
    version =  '0.1.0'
}

repositories {
    jcenter()
}

group 'teruuuu'
version '1.0-SNAPSHOT'

sourceCompatibility = 1.8
targetCompatibility = 1.8

dependencies {
    compile("org.springframework.boot:spring-boot-starter-web")
    // tag::actuator[]
    compile("org.springframework.boot:spring-boot-starter-actuator")
    // end::actuator[]
    // tag::tests[]
    testCompile("org.springframework.boot:spring-boot-starter-test")
    // end::tests[]
}

baseNameには任意のプロジェクト名を指定します。それからInteliJのツールウィンドウからGradleプロジェクトの同期を実行します。これでspring bootのjarが依存ライブラリとしてプロジェクトに含まれるはずです。

次に公式のサンプルソースと同様のコントローラを作成して見ます。

└── src
    └── main
        └── java
            ├── Apprication.java
            └── HelloController.java

Apprication.javaではspring bootを起動します。

package hello;

import java.util.Arrays;

import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;

@SpringBootApplication
public class Application {

  public static void main(String[] args) {
    SpringApplication.run(Application.class, args);
  }

  @Bean
  public CommandLineRunner commandLineRunner(ApplicationContext ctx) {
    return args -> {

      System.out.println("Let's inspect the beans provided by Spring Boot:");

      String[] beanNames = ctx.getBeanDefinitionNames();
      Arrays.sort(beanNames);
      for (String beanName : beanNames) {
        System.out.println(beanName);
      }
    };
  }
}

次にHelloController.javaでリクエストを受け取れるようにします。

package hello;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RequestMapping;

@RestController
public class HelloController {

  @Autowired
  AppConfig appConfig;

  @RequestMapping("/")
  public String index() {
    return "Greetings from Spring Boot!";
  }
}

後はspringを起動した後にリクエストを投げて動作確認ができます。

./gradlew build && java -jar build/libs/spring_test-0.1.0.jar

後はブラウザでlocalhost:8080にアクセスするかcurlを投げると"Greetings from Spring Boot!"と表示されます。

% curl localhost:8080                                                           
Greetings from Spring Boot!  

gradleでビルド時に環境ごとのリソースフォルダを切り替えれるようにする

build.gradleでパラメータを受け取り、その値によりsourceSets.main.resources.srcDirsを変更するようにします。

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:2.0.3.RELEASE")
    }
}

apply plugin: 'java'
apply plugin: 'idea'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'

bootJar {
    baseName = 'spring_test'
    version =  '0.1.0'
}

repositories {
    jcenter()
//    mavenCentral()
}

group 'teruuuu'
version '1.0-SNAPSHOT'

sourceCompatibility = 1.8
targetCompatibility = 1.8

dependencies {
    compile("org.springframework.boot:spring-boot-starter-web")
    // tag::actuator[]
    compile("org.springframework.boot:spring-boot-starter-actuator")
    // end::actuator[]
    // tag::tests[]
    testCompile("org.springframework.boot:spring-boot-starter-test")
    // end::tests[]
}

def environment = project.hasProperty( 'env' ) ? env : 'dev'
if( environment.equals( 'prod' ))
    sourceSets.main.resources.srcDirs 'src/main/resources/prod'
else
    sourceSets.main.resources.srcDirs 'src/main/resources/dev'

動作確認のために以下のリソースファイルを作成して見ます。
src/main/resource/dev/application.yml

app:
    env: dev

src/main/resource/prod/application.yml

app:
    env: prod

それから、設定内容をセットするbeanを作成します。
AppConfig.java

package hello;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;

@Component
@ConfigurationProperties(prefix="app")
@PropertySource(value = "application.yml")
public class AppConfig {
  private String env;

  public String getEnv() {
    return env;
  }

  public void setEnv(String env) {
    this.env = env;
  }
}

後はコントローラを修正し、AppConfigにセットされた値を表示するメソッドを追加します。 HelloController.Java

package hello;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RequestMapping;

@RestController
public class HelloController {

  @Autowired
  AppConfig appConfig;

  @RequestMapping("/")
  public String index() {
    return "Greetings from Spring Boot!";
  }

  @RequestMapping("/env")
  public String env() {
    return "env:" + appConfig.getEnv();
  }

}

それから、以下のようにビルド時にパラメータを渡せばリソースフォルダが切り替わります。

./gradlew clean build -Penv=prod && java -jar build/libs/spring_test-0.1.0.jar

% curl localhost:8080/env                                                       
env:prod%

Springはドキュメントが充実していると思いますが、Spring Boot Gradle Pluginの説明はこちらになります。