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の説明はこちらになります。