spring boot 프로젝트를 구성하고 build를 실행하면 아래와 같이 2개의 jar 파일이 생성되는 것을 알 수 있습니다.
- *-SNAPSHOT.jar
- *-SNAPSHOT-plain.jar
두 개의 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
'🔓 영구 노트' 카테고리의 다른 글
git 브랜치 전략 톺아보기 (1) | 2024.01.04 |
---|---|
RuntimeException이 왜 기본 롤백인지 (0) | 2023.12.21 |
autoprefixer: start value has mixed support, consider using flex-start instead (0) | 2023.12.17 |
github actions는 ㄱr끔 대소문ㅈr를 구분ㅎr지 못한ㄷr. (0) | 2023.12.16 |
코틀린 일급 컬렉션은 멋지지 (0) | 2023.12.14 |
댓글