빌드 자동화 도구. (오픈 소스)
Install
brew install gradleVersion Catalog
- 
https://docs.gradle.org/current/userguide/platforms.html#sub:version-catalog 
- 
버전 관리하기 위한 방법 
- 
기본적으로 버전을 한곳으로 모아줌 → Gradle 7.4 에서 생긴 의존성 버전 중앙 집중관리 방식. 
- 
세가지 그룹을 가짐 - 
versions: 라이브러리 버전 
- 
libraries: 라이브러리 의존성 
- 
bundles: 라이브러리들을 묶어서 한번에 선언 
 
- 
- 
참고 
빌드
sourceCompatibility vs. targetCompatibility
- 
sourceCompatibility - 
소스 언어 수준을 나타냄 
- 
컴파일에 사용하는 jdk 버전 
- 
소스 코드를 사용할 수 있는 java버전을 제한함 
 
- 
- 
targetCompatibility - 
생성되는 바이크 코드의 수준을 나타냄 
- 
특정 VM 버전에 대한 class file을 생성함 
- 
클래스 파일은 이 설정에서 지정한 버전 이후는 실행되지만 이전 버전의 VM에서는 실행되지 않음 
- 
클래스 파일의 버전을 제어 
- 
프로그램에서 실행할 수 있는 가장 낮은 Java 버전을 의미 
 
- 
- 
이 값들을 1.5로 지정한다고해서 항상 jdk 1.5로 코드를 컴파일 할 수 있고, jdk 1.5에서 작동할 것으로 예상할 수 있는 것이 아니다. 사용 가능한 라이브러리라는 것. 
- 
https://stackoverflow.com/questions/16654951/gradle-sourcecompatibility-vs-targetcompatibility 
구성 방법
Cross project configuration
- 
하위 프로젝트 간에 빌드 로직을 공유하는 방법으로 subproject {},allprojects {}DSL을 통한 구성- 
권장하지 않은 방식 
 
- 
- 
이 방식을 사용하면 하위 프로젝트에 빌드 로직을 주입할 수 있는데, 이는 하위 프로젝트에서 보기에 명확하지 않아 로직을 이해하기 어렵게 만듦. 
- 
장기적으로 이 구성방법은 점점 더 많은 조건부 논리와 높은 유지보수 부담으로 복잡해짐 
- 
설정 시점에 프로젝트 간에 커플링이 생기기 때문에 configuration-on-demand와 같은 최적화가 제대로 작동하지 않는다. 
- 
이를 해결하기 위해 특정 타입의 하위 프로젝트에 플러그인 또는 설정을 적용 
Convention Plugins
plugins
- 
gradle task의 집합 
PluginDependencySpec.apply?
- 
현재 프로젝트에 플러그인의 적용 여부를 지정, 설정하지 않으면 프로젝트의 classpath에만 설정. 
- 
default: true
- 
플러그인의 클래스를 재사용하거나 하위 프로젝트에 적용할 때 유용함 plugins { id "org.company.myplugin" version "1.0" apply false } subprojects { if (someCondition) { apply plugin: "org.company.myplugin" } }
The Java Plugin
plugins {
    java
}Java 플러그인은 프로젝트에 테스트 및 번들링 기능과 할께 컴파일을 추가한다.
다음과 같은 task를 제공한다.

- 
compileJava- java 소스 컴파일
- 
processResources- 프로덕션 리소스를 프로덕션 리소스 디렉토리로 복사
- 
classes-
- 
compileTestJava- 테스트 소스 코드 컴파일
- 
processTestResources
- 
testClasses
- 
jar-main소스셋에 있는 클래스, 리소스를 기반으로 프로덕션 jar 파일 생성
- 
javadoc- Javadoc을 이용하여 프로덕션 java 소스의 API 문서 생성
- 
test- JUnit or TestNG 유닛 테스트 실행
- 
clean- 프로젝트 빌드 디렉토리 삭제
- 
cleanTaskName- 각 태스트에서 생성된 파일 제거.cleanJar,cleanTest, …
- 
compileSourceSetJava
- 
processSourceSetResources
- 
sourceSetClasses
- 
assemble- 모든 아카이브를 취합하는 집계 작업
- 
check- 테스트 같은 확인 작업을 수행하는 집계 작업
- 
build- 프로젝트듸 전체 빌드 작업을 수행하는 집계 작업
- 
buildNeeded
- 
buildDepencents
- 
buildConfigName
- 
uploadConfigName
프로젝트 레이아웃
기본적으로 아래와 같은 디렉토리를 따른다.
- 
src/main/java
- 
src/test/java
- 
src/test/resources
- 
src/sourceSet/java
- 
src/sourceSet/resources
소스 셋
- 
main,test
의존성 관리
- 
implementation- 구현 전용 의존성
- 
compileOnly- 런타임에 사용하지 않고 컴파일에만 사용될 경우
api 는 java plugin이 아니라 java library plugin에서 추가된 dependency configuration이다.
The Java Libaray Plugins

- 
java plugin과 java library plugin의 주요 차이점은 java libaray plugin는 consumer에게 노출되는 api개념을 도입한다는 것
task
projects
./gradlew -q projectsmulti-project 빌드 구조를 파악할 수 있음.
-q(--quiet) 옵션은 "Log errors only." 오류만 로깅하는 설정.
tasks
./gradlew tasks --allEtc
- 
assembleRelease: .apk 파일 만들어주는 android 태스크 
option
scan
- 
--scan옵션을 추가하면 결과를 웹 UI로 볼 수 있음
- 
다만, gradle에 결과를 전송해서 보는 방식 
scope
core ← web-core ← web
| Note | api 
 | 
| Note | implementation 
 | 
:web-code 모듈에 :core 모듈이 api 일 때
dependencies {
   api(project(:core))
}:web 모듈에 :web-core 모듈이 api 일 때
dependencies {
   api(project(:web-core))
}:web-code 모듈에 :core 모듈이 implementation 일 때
dependencies {
   implementation(project(:core))
}build
- fat jar
- 
Fat JAR란 모든 의존성에 있는 라이브러리가 자체 포함되어 있는 JAR 파일을 뜻한다. Fat JAR는 java -jar 명령어로 단독 실행할 수 있다. 
build.gradle.kts
NamedDomainObjectContainerExtensions
NamedDomainObjectCollectionExtensions
getting
val commonMain by getting
val commonMain by getting { }대리자 속성(delegate property)을 통해 컬렉션의 기존 요소(element)를 참조하는 관용적 방법.