TL;DR

  • Jrs는 단일 모듈 자바 프로젝트를 대상으로 jrs.toml 하나에서 빌드·테스트·실행·패키징을 처리하는 Rust 기반 JVM 빌드 도구임.
  • Kotlin, Scala, Groovy를 자바와 함께 컴파일하며, 의존성 해결 결과와 체크섬을 jrs.lock에 고정하고 오프라인 빌드를 지원함.
  • JUnit 계열·Spock·Kotest·ScalaTest·MUnit 테스트와 JUnit XML 보고서·JaCoCo 커버리지, 실행 감시 및 작업 훅을 제공함.
  • 일반·이식형·팻 JAR, 축소된 jlink 런타임, jpackage 네이티브 설치 프로그램을 만들며 Maven·Gradle 프로젝트의 매니페스트 변환도 지원함.
  • 실험 단계이며 Maven·Gradle 대체재가 아니고, 플러그인 시스템·빌드 DSL·멀티모듈 리액터 없이 기능 범위를 의도적으로 제한함.

개요

  • Jrs는 Rust로 작성된 JVM 빌드 시스템으로, jrs.toml 하나에서 자바 프로젝트를 빌드·테스트·실행·패키징함.
  • Kotlin, Scala, Groovy도 자바와 나란히 컴파일하며, 작은 매니페스트와 커밋하는 잠금 파일, 단일 바이너리로 구성되고 별도 빌드 스크립트를 작성하지 않음.

상태

  • Jrs는 실험 단계이며 Maven이나 Gradle의 대체재가 아님.
  • 단일 모듈 프로젝트를 빌드하고 두 도구의 기능 중 의도적으로 좁은 범위만 구현함. 플러그인 시스템, 빌드 DSL, 멀티모듈 리액터는 제공하지 않음.
  • 프로덕션 빌드에 도입하기 전에 자체 요구사항에 맞는지 평가해야 함.
  • 로드맵에는 알려진 미지원 항목이, 명세에는 설계 근거가 정리되어 있음.

매니페스트 하나, 빌드 스크립트 없음

  • 프로젝트 구성은 jrs.toml과 소스 트리로 이뤄짐. 의존성 해결 결과는 jrs.lock에 기록되며 이 파일은 저장소에 커밋함.
  • target/ 아래 항목은 모두 삭제 후 다시 빌드할 수 있는 임시 산출물임.
  • 매니페스트에는 프로젝트 이름·버전·메인 클래스, 자바 소스 버전과 javac 인자, 선택적 Kotlin 버전, 일반 의존성과 테스트 전용 의존성을 지정함.
  • 예시 의존성은 com.google.guava:guava 버전 33.0.0-jre와 테스트 클래스패스 전용 org.junit.jupiter:junit-jupiter 버전 5.10.2임.
  • 예시 프로젝트 구조는 jrs.toml, 커밋할 jrs.lock, src/main/java/, src/main/kotlin/, src/main/resources/, src/test/java/, 임시 target/로 구성됨.

제공 기능

의존성 해결

  • Maven Central 및 자체 저장소에서 의존성을 가져오며, 전이 의존성 그래프, 가장 가까운 버전 우선 조정(nearest-wins mediation), 제외, 분류자(classifier), 컴파일 전용 의존성, SNAPSHOT을 처리함.

버전 고정

  • 커밋된 jrs.lock에 모든 버전과 체크섬을 기록함.
  • 다운로드 파일은 공유 캐시에 저장하기 전에 검증하며, --offline 빌드는 해당 캐시만 사용함.

컴파일

  • 자바와 함께 Kotlin, Scala, Groovy를 컴파일하고 언어 간 양방향 호출을 지원함.
  • 각 컴파일러는 Maven Central에서 가져와 버전을 고정하고, 사용 중인 JDK에서 실행함.

테스트

  • JUnit 5·6, JUnit 4, Spock, Kotest, ScalaTest, MUnit을 지원함.
  • 클래스·태그·메서드로 테스트를 필터링하며 JUnit XML 보고서와 JaCoCo 커버리지를 생성함.

패키징

  • 모든 빌드에서 바이트 단위로 동일한 결과물을 만드는 일반·이식형·팻 JAR을 생성함.
  • 축소된 jlink 런타임 또는 jpackage를 통한 네이티브 설치 프로그램을 생성함.

실행

  • 메인 클래스를 직접 실행하며, --watch를 추가하면 변경 때마다 다시 빌드함.

작업

  • 코드 생성기, 체크섬, 기타 작업을 jrs.toml에 선언하고 고정된 훅에서 하위 프로세스로 실행함.
  • Maven Central에서 제공하는 자바 도구도 포함되며, 작업은 빌드를 확장할 수 있지만 빌드 순서를 재배열하지 않음.

마이그레이션

  • pom.xml, build.gradle, build.gradle.kts에서 한 번에 jrs.toml을 생성함. Spring Boot 빌드도 포함하며 검토가 필요한 항목을 보고함.

검사

  • jrs tree --why, jrs outdated, jrs classpath 명령을 제공함.
  • jrs add와 jrs remove는 매니페스트의 주석을 유지함.

설치

  • Jrs는 단일 바이너리이며, PATH 또는 JAVA_HOME에 JDK 17 이상이 필요함. Kotlin·Scala·Groovy 컴파일러는 직접 가져옴.
  • Apple 설치는 아래 명령으로 Apple Silicon 또는 Intel 빌드를 선택해 ~/.local/bin에 설치함. 다른 위치를 지정하려면 sh 뒤에 -s -- --to <dir>를 추가함.
  • curl -fsSL https://getjrs.dev/install.sh | sh
  • Linux 설치는 같은 스크립트로 x86_64 또는 ARM64 빌드를 선택해 ~/.local/bin에 설치함. 바이너리는 정적 링크되어 모든 배포판에서 실행됨.
  • curl -fsSL https://getjrs.dev/install.sh | sh
  • Windows 설치는 PowerShell에서 아래 명령으로 x86_64 바이너리 ZIP을 다운로드하고 jrs.exe를 압축 해제한 뒤, PATH에 포함된 디렉터리로 옮기는 방식임.
  • curl.exe -fsSLO https://github.com/pwittchen/jrs/releases/latest/download/jrs-x86_64-pc-windows-msvc.zip
  • tar -xf jrs-x86_64-pc-windows-msvc.zip jrs.exe
  • 소스 설치는 저장소를 복제한 뒤 cargo install --path .를 실행하는 방식임. Rust 에디션 2024를 지원하는 툴체인이 필요하며 바이너리는 ~/.cargo/bin에 설치됨.
  • git clone https://github.com/pwittchen/jrs.git
  • cd jrs
  • cargo install --path .
  • 각 릴리스에는 다운로드 검증용 SHA256SUMS 파일이 포함되며 설치 스크립트가 체크섬을 확인함.
  • 설치 후 jrs self check로 새 릴리스 여부를 확인하고, jrs self update로 체크섬 검증을 거쳐 현재 위치에서 업데이트함.
  • 시작 절차는 jrs init으로 jrs.toml, 메인 클래스, 테스트를 만든 뒤 jrs run과 jrs test를 실행하는 방식임. 기존 pom.xml 또는 build.gradle에서 시작할 경우 jrs migrate를 사용함.

연락·지원·컨설팅

  • Jrs는 Apache License 2.0에 따른 무료 오픈소스이며 상업적 사용도 포함함. 유료 등급, 기능 제한, 원격 측정은 없음.
  • Piotr Wittchen은 Jrs 제작자이며 계약 업무, 프로젝트 개발, 컨설팅을 제공함.
  • 이메일: [email protected]
  • 웹사이트: wittchen.io · GitHub: github.com/pwittchen