Spring Boot 2.5.5와 Gradle 8.x 호환성 문제 해결하기: LazyPublishArtifact 오류

문제 상황

최근 프로젝트를 빌드하는 중 다음과 같은 이해하기 어려운 오류 메시지를 만났습니다:

org.gradle.api.internal.artifacts.dsl.LazyPublishArtifact.<init>(Lorg/gradle/api/provider/Provider;)V
* Try:
> Run with --stacktrace option to get the stack trace.
> Run with --info or --debug option to get more log output.
> Run with --scan to get full insights.
> Get more help at https://help.gradle.org.
Deprecated Gradle features were used in this build, making it incompatible with Gradle 9.0.
You can use '--warning-mode all' to show the individual deprecation warnings and determine if they come from your own scripts or plugins.
BUILD FAILED in 816ms

이 오류는 Spring Boot 2.5.5Gradle 8.x 버전 간의 호환성 문제로 인해 발생했습니다. 구체적으로 LazyPublishArtifact 클래스의 생성자가 Gradle 8.x에서는 다른 방식으로 구현되어 있어 Spring Boot 플러그인이 예상하는 메서드를 찾을 수 없었던 것입니다.

문제 진단 과정

1. 오류 메시지 분석

오류 메시지는 org.gradle.api.internal.artifacts.dsl.LazyPublishArtifact.<init>(Lorg/gradle/api/provider/Provider;)V와 같은 형태로 나타났습니다. 이는 Provider 객체를 매개변수로 받는 LazyPublishArtifact 클래스의 생성자를 찾을 수 없다는 의미입니다.

2. 스택트레이스 확인

--stacktrace 옵션을 사용하여 더 자세한 오류 정보를 확인했을 때, Spring Boot Gradle 플러그인에서 문제가 발생한다는 것을 알 수 있었습니다:

문제 발생 위치: org.springframework.boot.gradle.plugin.JavaPluginAction.configureArtifactPublication

3. 환경 확인

프로젝트 환경 조사 결과:

  • Spring Boot 버전: 2.5.5
  • Gradle 버전: 8.12/8.14
  • Java 버전: 8

해결 과정

여러 가지 해결 방법을 시도했습니다:

1. build.gradle 파일 수정 시도

첫 번째로 PublishToMavenRepository 작업을 비활성화하는 방법을 시도했습니다:

tasks.withType(PublishToMavenRepository).configureEach {
    enabled = false
}

tasks.withType(PublishToMavenLocal).configureEach {
    enabled = false
}

하지만 이 방법으로는 문제가 해결되지 않았습니다.

2. 네트워크 타임아웃 설정 추가

gradle.properties 파일에 네트워크 타임아웃 설정을 추가했습니다:

org.gradle.internal.http.connectionTimeout=180000
org.gradle.internal.http.socketTimeout=180000

이 방법도 핵심 문제를 해결하지 못했습니다.

3. 플러그인 적용 방식 변경 시도

plugins {} 블록 대신 buildscript {} 블록을 사용하여 플러그인을 적용하는 방식도 시도했으나 또 다른 문제가 발생했습니다.

4. 성공적인 해결책: Gradle 버전 다운그레이드

결국 Gradle 7.x 버전을 사용하는 것이 가장 효과적인 해결책이었습니다. Homebrew를 통해 Gradle 7.6.4를 설치하고 이를 사용하여 빌드를 실행했습니다:

# Gradle 7.x 설치
brew install gradle@7

# Gradle 7.x로 빌드 실행
/usr/local/opt/gradle@7/bin/gradle build

이 방법을 통해 빌드가 성공적으로 진행되었습니다!

결론 및 장기적 해결책

Spring Boot 2.5.5는 Gradle 7.x와 호환되지만 Gradle 8.x와는 호환되지 않습니다. 이 문제를 해결하기 위한 장기적인 방법은 다음과 같습니다:

  1. PATH에 Gradle 7.x를 추가하여 항상 이 버전 사용:
  2. IDE 설정에서 프로젝트의 Gradle 버전을 7.x로 지정
  3. Spring Boot 버전 업그레이드: Spring Boot 2.7 이상으로 업그레이드하여 최신 Gradle과 호환되도록 조정
# PATH에 Gradle 7.x 추가하는 방법
echo 'export PATH="/usr/local/opt/gradle@7/bin:$PATH"' >> ~/.zshrc
source ~/.zshrc

교훈

이 문제를 통해 얻은 교훈은 다음과 같습니다:

  • 라이브러리와 도구 간의 버전 호환성은 매우 중요합니다.
  • Spring 프레임워크와 Gradle 같은 도구는 특정 버전 조합에서만 정상적으로 작동할 수 있습니다.
  • 오류 메시지가 명확하지 않더라도 스택트레이스 분석을 통해 문제의 원인을 찾을 수 있습니다.
  • 프로젝트 구성 요소를 업그레이드할 때는 호환성 문서를 먼저 확인하는 것이 좋습니다.

Gradle 7.6.4 릴리스 노트: https://docs.gradle.org/7.6.4/release-notes.html

이 글이 같은 문제로 고생하고 있는 개발자들에게 도움이 되길 바랍니다.