본문 바로가기
🔓 영구 노트

plain Jar 파일이 생성되지 않도록 하자

by 파랭이가 룰루랄라 2024. 1. 8.

spring boot 프로젝트를 구성하고 build를 실행하면 아래와 같이 2개의 jar 파일이 생성되는 것을 알 수 있습니다.

  • *-SNAPSHOT.jar
  • *-SNAPSHOT-plain.jar

build/libs/*

두 개의 jar파일 중 plain이 포함된 것을 `일반` jar 파일이라고 부르고, 포함되지 않은 것을 `실행 가능한` jar파일이라고 부릅니다.

(경우에 따라 다르게 부를 수 있습니다)

 

`일반` jar 파일: 일반 jar 파일은 라이브러리 형태의 Java 애플리케이션을 패키징 하기 위해 사용되는 것으로 다른 애플리케이션에서 라이브러리로 사용될 수 있도록 클래스와 리소스만을 포함됩니다. 즉, 애플리케이션을 실행하기 위한 모든 의존성과 실행 환경을 포함하지 않기 때문에 독립적으로 실행이 불가합니다.

 

`실행 가능한` jar 파일: bootJar는 Spring Boot 애플리케이션을 위한 실행 가능한 JAR 파일을 생성합니다. 이 파일은 애플리케이션의 모든 클래스와 리소스뿐만 아니라, 내장된 서버(예: Tomcat), 그리고 애플리케이션을 실행하는 데 필요한 모든 의존성도 포함되기 때문에 java 환경만 있다면 어디에서든 독립적으로 실행될 수 있습니다.

 

독립적이라는 것은 jar 파일만 있다면 클래스 파일이 없어도 실행이 가능하다는 것을 뜻하고, 이러한 특성 때문에 docker 이미지를 생성할 때 대부분 실행 가능한 jar 파일을 사용합니다.

 

위에서 알아보았듯이 특수한 경우가 아니라면 plain 이름이 포함된 jar 파일은 사용하지 않게 되는데요. 사용하지 않는다면 불필요하게 빌드 시에 만들어지지 않도록 할 수 있습니다.

 

build.gradle 파일을 사용한다면 아래 코드를 추가해주면 됩니다.

// 실행 가능한 JAR 생성 설정
bootJar {
    enabled = true
}

// 일반 JAR 파일 생성 비활성화
jar {
    enabled = false
}

build.gradle.kts 파일을 사용한다면 아래 코드를 추가해주면 됩니다.

tasks.apply {
    bootJar {
    	// 실행 가능한 JAR 생성 설정
        enabled = true
    }
    jar {
        // 일반 JAR 파일 생성 비활성화
        enabled = false
    }
}

마무리

dockerfile을 만들 때 plain jar파일을 사용하는 경우 만들어진 도커 이미지가 실행되지 않기 때문에 아래와 같이 추가한 경험이 있습니다.

COPY build/libs/core-0.0.1-SNAPSHOT.jar app.jar

 

취향의 차이일 수 있겠지만 bootJar 파일만 생성가능하도록 하면 아래와 같이 코드를 변경할 수 있습니다.

COPY build/libs/*.jar app.jar

댓글