JLink는 자신만의 맞춤형 JRE(Customized JRE)를 생성할 수 있게 해주는 새로운 링커(Linker) 도구입니다. 보통 프로그램을 실행할 때는 Oracle이 제공하는 기본 JRE를 사용하지만, 직접 JRE를 구성해야 하는 상황이라면 이 도구를 활용하면 됩니다.
JLink는 애플리케이션 실행에 필요한 클래스만 포함된 JRE를 만들어 주기 때문에, 배포 패키지의 크기를 크게 줄일 수 있고 전체 JRE에 대한 의존성도 해소할 수 있다는 장점이 있습니다.
링크 타임(Link Time)이라는 새로운 단계
Java 9에서는 코드를 컴파일하고 실행하기 사이에 새로운 단계가 도입되었습니다. 바로 링크 타임(Link Time)으로, 컴파일 타임(Compile Time)과 런타임(Runtime) 사이에 위치하는 선택적(Optional) 단계입니다. JLink는 바로 이 링크 타임에 모듈들을 연결하여 최적화된 런타임 이미지를 생성합니다.
커스텀 JRE 생성 기본 명령어
jlink --module-path --add-modules --limit-modules --output
주요 옵션 설명
- module-path: 링커가 관찰 가능한(Observable) 모듈을 검색하는 경로입니다. 모듈형 JAR 파일, JMOD 파일, 그리고 모듈들이 여기에 해당됩니다.
- add-modules: 런타임 이미지에 추가할 모듈의 이름을 지정합니다. 지정된 모듈은 전이 의존성(Transitive Dependencies)을 통해 다른 모듈들까지 함께 가져올 수 있습니다.
- limit-modules: 관찰 가능한 모듈의 범위를 제한하여 불필요한 모듈이 포함되지 않도록 합니다.
- output: 생성된 런타임 이미지가 저장될 출력 디렉터리를 지정합니다.
실제 사용 예시
jlink --module-path $JAVA_HOME/jmods:mlib --add-modules com.greetings --output greetingsapp
위 명령어에서 module-path 값은 패키징된 모듈들이 들어 있는 디렉터리 경로입니다. $JAVA_HOME/jmods는 java.base.jmod를 비롯한 표준 및 JDK 모듈들이 포함된 디렉터리이며, 모듈 경로상의 mlib 디렉터리에는 com.greetings 모듈의 아티팩트(Artifact)가 담겨 있습니다.
이렇게 실행하면 greetingsapp이라는 디렉터리에 해당 애플리케이션 실행에 꼭 필요한 모듈만으로 구성된 가벼운 커스텀 JRE가 생성됩니다. 클라우드 환경이나 컨테이너처럼 배포 크기가 중요한 환경에서 특히 유용하게 활용할 수 있습니다.