Cloud Foundry の Java Buildpack で Java 11 を動かしてみた

Cloud Foundry の Java Buildpack で Java 11 が使えるようになっています!

今回はこのビルドパックで Java 11 を試してみたいと思います.

ソースコード

今回のサンプルコードです.

buildscript {
	ext {
		springBootVersion = '2.1.2.RELEASE'
	}
	repositories {
		mavenCentral()
	}
	dependencies {
		classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
	}
}

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

war {
	enabled = true
	archiveName 'sample.war'
}

group = 'com.project-respite'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11.0'

repositories {
	mavenCentral()
}

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

 
Java 11 を指定します.

sourceCompatibility = ‘11.0’

 

package com.projectrespite.cloudfoundryjava11sample;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;

@SpringBootApplication
public class CloudfoundryJava11SampleApplication extends SpringBootServletInitializer {

	public static void main(String[] args) {

		SpringApplication.run(CloudfoundryJava11DemoApplication.class, args);
	}
}

 
SpringBootServletInitializer を継承します.

class CloudfoundryJava11SampleApplication extends SpringBootServletInitializer

 

package com.projectrespite.cloudfoundryjava11sample;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class SampleController {

    @GetMapping(value="/repeat", produces = "application/json")
    public String getRepeat(){
        return "test".repeat(3);
    }
}

 
Java 11 の新機能、String#repeat を使用します.

“test”.repeat(3)

 

ビルド

今回は Gradle の Docker イメージを使ってビルドします.

まずは Docker イメージを Pull します.

$ docker pull gradle:5.1.1-jdk11
5.1.1-jdk11: Pulling from library/gradle
ab1fc7e4bf91: Pull complete 
35fba333ff52: Pull complete 
f0cb1fa13079: Pull complete 
3d1dd648b5ad: Pull complete 
a9f886e483d6: Pull complete 
f0c295b9cf6e: Pull complete 
afe560095725: Pull complete 
dc8253cd29cd: Pull complete 
6885295983c8: Pull complete 
c6dff731bb7a: Pull complete 
74623ed176ef: Pull complete 
Digest: sha256:1bae069234b4c8af2f21c51c05505981d7b9e59fdb8ea35393a9a841c25ca7e1
Status: Downloaded newer image for gradle:5.1.1-jdk11

 

gradle war で .war を生成します.

$ cd /path/to/gradle/project

$ docker run \
  -v $PWD:/app \
  -w /app \
  -u $UID:$GID \
  -p 8080:8080 \
  gradle:5.1.1-jdk11 \
  gradle war

Starting a Gradle Daemon, 1 incompatible and 1 stopped Daemons could not be reused, use --status for details
> Task :compileJava
> Task :processResources
> Task :classes
> Task :war

BUILD SUCCESSFUL in 2m 1s
3 actionable tasks: 3 executed

 
Docker イメージでビルド出来るのは楽ですね〜♩

 

デプロイ

以下のような manifest.yml を用意しました.

applications:
  - name: cloudfoundry-java11-sample
    buildpack: https://github.com/cloudfoundry/java-buildpack.git#v4.17.2
    memory: 1024MB
    instances: 1
    path: build/libs/sample.war
    timeout: 180
    env:
      JBP_CONFIG_TOMCAT: '[tomcat: {context_path: "/api"}]'
      JBP_CONFIG_OPEN_JDK_JRE: '{ jre: { version: 11.+ } }'

 
ビルドパックをタグ込みで指定します.

buildpack: https://github.com/cloudfoundry/java-buildpack.git#v4.17.2

環境変数にコンテキストパスと JRE のバージョンを指定します.

env:
 JBP_CONFIG_TOMCAT: ‘[tomcat: {context_path: “/api”}]’
 JBP_CONFIG_OPEN_JDK_JRE: ‘{ jre: { version: 11.+ } }’

 

実行結果

$ curl https://cloudfoundry-java11-sample.mybluemix.net/api/repeat
testtesttest

 
リピートした文字列が取得できていますね!

 

まとめ

今回は Cloud Foundry の Java Buildpack で Java 11 を使ってみました.
manifest.yml に設定が必要な箇所がありますが、わりとサクッと使えました.
その気になれば Java 11 で本格運用できそうです.

次回は CI/CD でデプロイするところをやってみようと思います.

 

以上です.