Gradle에서 task.named vs tasks.withType의 차이

2025. 4. 28. 23:27·트러블슈팅

최근 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를 설정할 때 두 가지 방법을 제공한다:

  1. tasks.withType<T>: 즉시(eager) 설정 적용
  2. 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
'트러블슈팅' 카테고리의 다른 글
  • 다국어 다루기
  • JPA, 트랜잭션, IDENTITY, SEQUENCE 전략에 대한 오해와 이해
  • NoOpServerSecurityContextRepository 와 ReactiveSecurityContextHolder 차이
  • spring batch reader
jamin
jamin
  • jamin
    jamin
    jamin
  • 전체
    오늘
    어제
    • 전체 (102)
      • 트러블슈팅 (32)
      • 개념 저장소 (25)
        • coroutine (10)
        • spring reactive (9)
        • network (6)
      • 코딩 테스트 (45)
  • 블로그 메뉴

    • 홈
    • 트러블 슈팅
    • 태그
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    coroutine
    누적합
    Kotlin
    log
    정렬
    mirroring mode
    error alram
    batch
    대용량 데이터
    분리집합
    dfs
    BFS
    spring reactive
    다익스트라
    코테
    다이나믹 프로그래밍
    백준 23758
    instancio
    JPA
    reactive
    구현
    spring boot
    경로압축
    코딩테스트
    수학
    DP
    그리디 알고리즘
    sinks
    그리디
    백준
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
jamin
Gradle에서 task.named vs tasks.withType의 차이
상단으로

티스토리툴바