그레이들을 건드리면서 한숨을 참 많이 한것 같다 (
이 코끼리자식아
)
머만 하면 컴파일 에러가 뜨지 않나...
자바와는 다르게 빠르게 시행착오를 통해 배우는게 쉽지 않다
사실 지금도 정확히 안다기보다는 대략 이런 느낌으로 하면 버그를 없앨 수 있지않을까... 하면서 진행했던게 도움이 되었다
공식문서, 유튜브 등을 참고 해봤지만 크게 도움되지는 않았던 것 같다
서론이 길었다, 멀티 모듈하면서 공통 의존성들이 많이 생긴다. 이걸 관리하는 방법은 크게 두 가지이다
이펙티브 자바식으로 얘기하면 상속과 조합이다 (Gradle에서 공식적으로 사용하는 용어가 아닙니다!)
상속
부모 디렉터리에 공통 의존성을 정의한다
그러면 자식은 그 의존성을 받기만 하면 되며 별다른 설정은 하지 않아도 된다
예를 들면, 내가 실제로 사용했던 설정인데 아래처럼 부모의 내용을 정의할 수 있다
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
id 'org.springframework.boot' version '3.0.2'
id 'io.spring.dependency-management' version '1.1.0'
id 'org.jetbrains.kotlin.jvm' version '1.7.22'
id 'org.jetbrains.kotlin.plugin.spring' version '1.7.22'
}
allprojects {
group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '17'
repositories {
mavenCentral()
maven { url 'https://artifactory-oss.prod.netflix.net/artifactory/maven-oss-candidates' }
}
tasks.withType(KotlinCompile).configureEach {
kotlinOptions {
freeCompilerArgs = ['-Xjsr305=strict']
jvmTarget = JavaVersion.VERSION_17.toString()
}
}
}
subprojects {
apply plugin: 'java'
apply plugin: 'org.jetbrains.kotlin.jvm'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'
apply plugin: 'org.jetbrains.kotlin.plugin.spring'
dependencies {
// Kotlin
implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk8'
...
// Spring Web Based On Tomcat
implementation 'org.springframework.boot:spring-boot-starter-web'
...
}
ext {
set('springCloudVersion', "2022.0.1")
}
dependencyManagement {
imports {
mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
}
}
}
configurations {
compileOnly {
extendsFrom annotationProcessor
}
}
tasks.named('test') {
useJUnitPlatform()
}
allProjects는 부모와 자식 모듈들 모두에서 사용하고
subProjects는 위에서 부모를 제외한 설정이다
자식 모듈에서 별도 dependency 추가
만일 자식에서 별도의 의존성을 추가하고 싶으면 아래처럼 build.gradle을 생성후에 똑같이 작성하면 된다
dependencies {
...
// config client
implementation 'org.springframework.cloud:spring-cloud-starter-config'
implementation 'org.springframework.cloud:spring-cloud-starter-bootstrap'
// actuator
implementation 'org.springframework.boot:spring-boot-starter-actuator'
}
자식 모듈에서 특정 dependency 제거
때로는 부모의 의존성을 물려받으면 안 될 때가 있다.
예를 들면 Spring Cloud Gateway는 Tomcat이 아닌 Netty를 사용하는데, 톰캣 dependency를 막아야 한다
configurations {
all*.exclude group: 'org.springframework.boot', module: 'spring-boot-starter-web'
}
조합
자바에서도, 조슈아 블로크가 말했듯이 상속에는 한계가 있다.
- 캡슐화 위반
- 확장 제약(다이아 상속 안됨, 단일임)
- 불필요한 API까지 상속
- 오용 (is-a, has-a등)
Gradle에서 위와 같은 단점이 비슷하게 일어난다...
물려 받고 싶지 않은게 생기면 일일이 제외를 해야 한다
우선 부모 디렉터리 바로 밑에 저렇게 공용으로 사용할 의존성을 선언한 후에
자식 모듈 build.gradle에서는 아래 처럼 작성하면 depencenies를 import할 수 있다
dependencies {
apply from: rootProject.file('gradle-dependencies/spring.config-client-and-actuator.gradle')
}
참고로 apply from이 dependencies 밖에 있어도 된다 (확인 완료)
'Back-end > Build (Gradle, Maven)' 카테고리의 다른 글
[Gradle] 기존의 프로젝트의 이름(group, artifact) 바꾸기 (0) | 2023.06.13 |
---|---|
Gradle dependency 분리 하면서 생긴 문제, 해결 (0) | 2023.05.28 |
Gradle 성능 최적화 (0) | 2023.05.12 |
Gradle 멀티 모듈하면서 배운 것들 (0) | 2023.05.12 |
Maven - New Lecture 강의록 (1) | 2020.10.01 |
hi hello... World >< 가장 아름다운 하나의 해답이 존재한다
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!