최근 Gradle 멀티모듈 프로젝트를 구성하다가 이상한 현상을 마주했다. Spring Boot의 bootJar 작업을 활성화했는데 JAR 파일이 전혀 생성되지 않는 문제였다.
처음 설정은 이랬다:
tasks.withType<org.springframework.boot.gradle.tasks.bundling.BootJar> {
enabled = true
}
tasks.withType<Jar> {
enabled = false
}
이 설정은 JAR 파일은 생성되지 않았다.
문제가 발생한 이유
이 문제는 Gradle이 Task를 설정하는 방식과 시점에 있다. Gradle은 Task를 설정할 때 두 가지 방법을 제공한다:
- tasks.withType<T>: 즉시(eager) 설정 적용
- tasks.named<T>("taskName"): 나중에(lazy) 설정 적용
tasks.withType은 설정을 즉시 적용하는 방식인데, 이로 인해 Gradle의 구성 단계 초기에 설정 코드가 실행될 때 아직 플러그인이 적용되지 않아 관련 Task가 등록되지 않은 상태일 수 있다.
Spring Boot Plugin이 적용되어 bootJar Task가 생성되기 이전에 withType이 실행되기 때문에 해당 Task가 없어서 설정이 적용되지 않고 무시된다.
tasks.named는 설정을 나중에 적용하는 Lazy 방식이기 때문에, Task가 나중에 등록되더라도 설정이 확실히 적용된다.
내가 withType을 사용했을 때는 bootJar Task가 아직 생성되지 않은 시점이여서 설정이 아예 적용되지 않은 것이다.
문제 해결 방법
그래서 설정 방식을 다음과 같이 named로 변경했다:
tasks.named<BootJar>("bootJar") {
enabled = true
}
tasks.named<Jar>("jar") {
enabled = false
}
이렇게 하니 정상적으로 JAR 파일이 생성되었다.
Task method
| 메서드 | 설명 | 적용 시점 |
| tasks.getByName("taskName") { … } | 이미 등록된 Task를 즉시 찾아 설정을 적용. Task가 없으면 바로 예외 발생. | 즉시(eager) |
| tasks.named<SomeType>("taskName") { … } | 이름으로 Task를 지정해 Lazy하게 설정을 적용. Task가 나중에 등록되어도 설정이 붙음. | 지연(lazy) |
| tasks.withType<SomeType> { … } | 특정 타입의 모든 Task를 즉시 찾아 설정을 적용. Task가 아직 없으면 아무 것도 하지 않음. | 즉시(eager) |
| tasks.register("taskName", TaskType::class) { … } | 새 Task를 Lazy하게 등록하고, 등록 시점에 설정을 한 번에 적용. | 지연(lazy) |
| tasks.create("taskName") { … } | 새 Task를 즉시 생성하고, 생성 직후 설정을 바로 적용. | 즉시(eager) |
| tasks.configureEach { … } | 모든 Task에 대해 Lazy 방식으로 공통 설정을 추가. | 지연(lazy) |
| project.afterEvaluate { tasks.findByName("…") } | 구성 단계가 끝난 뒤에 생성된 Task에 접근해서 설정. | 구성 완료 후 |
참고
https://docs.gradle.org/current/dsl/org.gradle.api.tasks.TaskCollection.html?utm_source=chatgpt.com
'트러블슈팅' 카테고리의 다른 글
| 다국어 다루기 (0) | 2025.09.16 |
|---|---|
| JPA, 트랜잭션, IDENTITY, SEQUENCE 전략에 대한 오해와 이해 (0) | 2025.04.16 |
| NoOpServerSecurityContextRepository 와 ReactiveSecurityContextHolder 차이 (0) | 2025.04.12 |
| spring batch reader (0) | 2025.01.31 |
| 코틀린에서 파이썬 코드 실행하기 (2) | 2024.12.28 |