Eureka Client를 spring boot로 추가하면서 발생한 에러
idea가 제공하는 spring boot v3.3.0 으로 Eureka Discovery Client를 추가하고 build 하자 아래와 같은 에러를 만났다.
error를 그대로 검색한 결과, JVM의 버전이 17이상이 아니기 때문이다. 혹은 spring boot 버전이 의존성과 호환되지 않는다. 등이 문제의 원인으로 제기되었지만, 전혀 통하지 않았다.
에러가 발생한 build.gradle
plugins {
id 'java'
id 'org.springframework.boot' version '3.3.0'
id 'io.spring.dependency-management' version '1.1.5'
}
ext {
springCloudVersion = "2023.0.3"
}
group = 'pinting'
version = '0.0.1-SNAPSHOT'
java {
sourceCompatibility = '17'
}
configurations {
compileOnly {
extendsFrom annotationProcessor
}
}
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-actuator'
implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
runtimeOnly 'org.postgresql:postgresql'
runtimeOnly 'com.h2database:h2'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta'
annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jakarta"
annotationProcessor "jakarta.annotation:jakarta.annotation-api"
annotationProcessor "jakarta.persistence:jakarta.persistence-api"
}
tasks.named('test') {
useJUnitPlatform()
jvmArgs '-Xshare:off'
}
def querydslSrcDir = 'src/main/generated'
clean {
delete file('src/main/generated')
}
dependencyManagement {
imports {
mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
}
}
tasks.withType(JavaCompile) {
options.generatedSourceOutputDirectory = file(querydslSrcDir)
}
문제: dependencyManagement의 위치
dependencies 선언 밑에 dependencyManagement가 있었기 때문에 발생한 에러다.
위치를 dependencies 상위로 변경하면 문제 없이 spring cloud dependencies를 잘 불러온다.
반성합니다..
편리함에 속아 build.gradle의 항목들을 대충 이해하고 넘어갔던 것이 화근이었다.
그렇다고 gradle 전문가 코스를 다시 밟을 순 없으니.. Dependency Management와 관련된 내용이라도 공식문서를 통해 이해하고 넘어가자.
Spring Blog의 내용
해당 의존성의 메타데이터를 받아오기 위해 maven BOM(bill-of-materials)를 gradle에서 사용하는 방법이다.
start.spring.io에서 Eureka Discovery Client만 import한 결과물이다. 이 녀석도 같은 문제가 있다. 왜일까? 나중에 알아보자.
plugins {
id 'java'
id 'org.springframework.boot' version '3.3.4'
id 'io.spring.dependency-management' version '1.1.6'
}
group = 'com.example'
version = '0.0.1-SNAPSHOT'
java {
toolchain {
languageVersion = JavaLanguageVersion.of(17)
}
}
repositories {
mavenCentral()
}
ext {
set('springCloudVersion', "2023.0.3")
}
dependencies {
implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
}
dependencyManagement {
imports {
mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
}
}
tasks.named('test') {
useJUnitPlatform()
}
수정한 build.gradle
plugins {
id 'java'
id 'org.springframework.boot' version '3.3.0'
id 'io.spring.dependency-management' version '1.1.5'
}
ext {
springCloudVersion = "2023.0.3"
}
group = 'pinting'
version = '0.0.1-SNAPSHOT'
java {
sourceCompatibility = '17'
}
configurations {
compileOnly {
extendsFrom annotationProcessor
}
}
repositories {
mavenCentral()
}
dependencyManagement {
imports {
mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
}
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-actuator'
implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
runtimeOnly 'org.postgresql:postgresql'
runtimeOnly 'com.h2database:h2'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta'
annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jakarta"
annotationProcessor "jakarta.annotation:jakarta.annotation-api"
annotationProcessor "jakarta.persistence:jakarta.persistence-api"
}
tasks.named('test') {
useJUnitPlatform()
jvmArgs '-Xshare:off'
}
def querydslSrcDir = 'src/main/generated'
clean {
delete file('src/main/generated')
}
tasks.withType(JavaCompile) {
options.generatedSourceOutputDirectory = file(querydslSrcDir)
}
빌드 문제가 해결되고 잘 실행되는 것을 확인할 수 있다. 야호
※ 질문, 개선점, 오류가 있다면 댓글로 남겨주세요 :)
'Architecture > MSA' 카테고리의 다른 글
[JAVA/Spring/MSA] 1. 프로젝트 MSA 적용 여정: 유레카 클라이언트 (0) | 2024.10.25 |
---|---|
[JAVA/Spring/MSA] 0. 프로젝트 MSA 적용 여정: 유레카 서버 (5) | 2024.10.07 |