Springboot Java17 with jlink

Kevin Park
4 min readSep 28, 2021

안녕하세요. Kevin 입니다.

새로운 LTS 버전인 Java17이 GA 되고 Adoptium (구 AdoptOpenJDK)에서 17버전이 나왔습니다. sdkman을 사용하는 경우는 Vendor Temurin 으로 확인 할 수 있습니다.

Java17을 기다리면 꾸준히 버전업을 해왔기에 바로 적용을 시도 했습니다. 진행을 위해 이미지 확인을 하는데 Termurin docker hub에서 JRE가 없습니다…. Adoptium 에서 JRE를 제공하지 않기로 결정했다고 하네요. 대신 jlink를 이용한 custom runtime을 권장하는데요

그래서 Adoptium blog의 내용을 참고하여 Jlink로 진행 하였습니다.

EasyJRE 를 이용하여 module 목록을 추가 한 후 추가로 필요한 module은 docker build, docker run 시 발행하는 오류를 확인하여 진행하였습니다.

docker build 시 Jlink 실행 부분에서 아래 오류가 나와

Error: java.io.IOException: Cannot run program "objcopy": error=2, No such file or directory

Dockerfile 에 apk add 를 통해 binutils를 추가했습니다.

RUN apk --no-cache add binutils

그리고 실행 시점에 CGLIB 관련 UnsatisfiedDependencyException, GC notifications will not be available because com.sun.management.GarbageCollectionNotificationInfo is not present, SSLHandshakeException 이 발생하여 module 를 추가 하였습니다.

최종 Create a custom Java runtime 명령 입니다.

RUN $JAVA_HOME/bin/jlink \
--add-modules java.base,java.compiler,java.datatransfer,java.desktop,java.instrument,java.logging,java.management,java.management.rmi,java.naming,java.net.http,java.prefs,java.rmi,java.scripting,java.se,java.security.jgss,java.security.sasl,java.sql,java.sql.rowset,java.transaction.xa,java.xml,java.xml.crypto,jdk.unsupported,jdk.management,jdk.crypto.ec \
--strip-debug \
--no-man-pages \
--no-header-files \
--compress=2 \
--output /home/gradle/project/jre

작성한 테스트를 모두 패스하고 정상동작 확인하였습니다. 테스트 환경구성은 Java17, Springboot2.5.5, Gradle7.2 입니다.

감사합니다.

추가로 필요한 module을 찾아 조금 더 가벼운 custom java runtime을 만들 수 있는 링크 공유 합니다. https://mbien.dev/blog/entry/custom-java-runtimes-with-jlink

--

--