피드로 돌아가기
Java To Native Linux App: One 5MB Binary, x64 And Arm
Dev.toDev.to
Infrastructure

JVM 제거 및 ParparVM 기반 5MB 단일 ELF 네이티브 바이너리 구현

Java To Native Linux App: One 5MB Binary, x64 And Arm

Shai Almog2026년 6월 27일5advanced

Context

기존 Linux 환경에서는 executable jar 형태로 배포하여 사용자 기기에 JVM 설치가 필수적인 제약 존재. JVM 의존성으로 인한 실행 속도 저하와 배포 복잡도를 해결하기 위한 네이티브 런타임 구조 필요.

Technical Solution

  • ParparVM을 통한 Java/Kotlin Bytecode의 C 언어 변환 및 Native Binary 컴파일 구조 설계
  • GTK3, Cairo, Pango 등 OS 표준 스택 활용을 통한 별도 런타임 라이브러리 번들링 제거
  • glibc 버전 파편화 해결을 위해 2013년 출시된 GLIBC_2.17 기반 빌드로 하위 호환성 확보
  • 리소스 파일의 ELF 내부 임베딩 방식을 통한 단일 self-contained 바이너리 패키징 구현
  • Dead-strip 최적화를 통한 미사용 코드 제거 및 바이너리 크기 최소화
  • Zig 크로스 컴파일러 도입으로 x64 및 Arm64 아키텍처 통합 빌드 환경 구축

Impact

  • JVM 없이 실행 가능한 약 5MB 규모의 경량 바이너리 생성
  • 일반적인 GNOME 네이티브 앱보다 빠른 초기 구동 속도 달성
  • 173개의 Native Method를 통한 OS 레벨 API 직접 제어

Key Takeaway

런타임 의존성을 제거하기 위해 Bytecode를 Native 언어로 정적 변환하고, 가장 낮은 공통 분모의 시스템 라이브러리를 타겟팅하여 배포 범용성을 극대화하는 설계 전략


- 리눅스 배포판 간 glibc 버전 충돌 방지를 위해 타겟 버전을 과거 안정 버전으로 설정했는지 확인 - 바이너리 크기 최적화를 위해 Dead-strip 및 Symbol 제거 옵션 적용 검토 - 외부 의존성을 최소화하기 위해 OS 표준 라이브러리(GTK 등)의 동적 링크 활용 가능성 분석

원문 읽기