Gradle Wrapper
IntelliJ에서 gradle 프로젝트를 생성하면, default gradle wrapper를 사용할 것인지
아니면 로컬 gradle 배포 버전을 사용할지 선택하는 화면이 나오는데,
gradle wrapper 가 recommend 가 되어 있어 의식하지 않은 채 사용을 하고 있었다가 문득 궁금해져서 알아보았습니다.
Gradle Wrapper(이하 'Wrapper')는 명시된 gradle 버전을 호출하는 스크립트라고 합니다.
( 필요한 경우에는 미리 gradle을 다운로드 합니다 )
별도 해당 gradle 버전을 받아서 설치하는 과정이 생략되는 것입니다.
Gradle에서 dependency 들을 알아서 받아서 관리해주는 것과 동일하게 보면 됩니다.
정의 : 시스템에 Gradle 을 설치하지 않고 Gradle task를 수행할 수 있게 해 줍니다.
로컬 환경에서 gradle build를 하게 되면, 로컬에 구성된 gradle 버전으로 빌드가 되지만
./gradlew build 를 하게 되면, Wrapper에 명시된 버전으로 로컬 환경과 관계없이 프로젝트를 빌드할 수 있습니다.
그래서 여러 명이서 서로 다른 환경에서 빌드를 할 때, 서로 다른 환경에 따른 빌드로 문제가 생기는 것을 막을 수 있습니다.
Gradle Project 만들기
IntelliJ에서 Gradle에 Java를 체크하고 프로젝트를 만들면 됩니다.
그러면 프로젝트에 아래와 같이 gradle 폴더가 생성됩니다.
.
├── build.gradle
├── settings.gradle
├── gradle
│ └── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradlew
└── gradlew.bat
Wrapper를 사용하는 프로젝트에는 위와 같은 Wrapper 파일들이 존재합니다.
gradle-wrapper.properties
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-6.5.1-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
Wrapper 설정 파일이며, gradle path, version, proxy 설정 등의 정보를 저장할 수 있습니다.
distributionUrl에 지정되어 있는 gradle 버전을 사용하여 빌드를 하게 됩니다.
gradle-wrapper.jar
명시된 Gradle 배포 버전을 포함하고 있는 Wrapper JAR 파일입니다.
gradlew, gradlew.bat
Wrapper를 빌드할 때 실행할 배치 스크립트입니다.
wrapper Task 활용
IntelliJ의 Gradle 탭에 보면, build setup 폴더에 wrapper 태스크가 존재합니다.
이 태스크를 수행하면, gradle wrapper를 사용하기 위한 파일들을 생성해 줍니다.( 프로젝트 생성 시, 생성된 gradle 폴더 )
wrapper{
gradleVersion = '6.8.1'
}
그리고 위와 같이 wrapper 클로져를 작성하여, gradleVersion을 명시한 뒤에 wrapper 태스크를 수행하면
아래와 같이 gradle 버전이 6.5.1(이전)에서 6.8.1로 변경된 것을 확인할 수 있습니다.
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-6.8.1-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
그리고 터미널에서 gradlew의 버전을 확인해보면, 기존에 시스템에 Gradle 6.5.1가 설치되어 있고
properties 에는 6.8.1을 사용하도록 되어있어서 6.8.1을 다운로드하고 난 뒤에 gradlew -v 명령어를 수행하여
버전이 6.8.1 임을 출력해줍니다.
➜ MyJavaGradle ls
build build.gradle gradle gradlew gradlew.bat settings.gradle src
➜ MyJavaGradle ./gradlew -v
Downloading https://services.gradle.org/distributions/gradle-6.8.1-bin.zip
..........10%..........20%..........30%...........40%..........50%..........60%..........70%...........80%..........90%..........100%
Welcome to Gradle 6.8.1!
Here are the highlights of this release:
- Faster Kotlin DSL script compilation
- Vendor selection for Java toolchains
- Convenient execution of tasks in composite builds
- Consistent dependency resolution
For more details see https://docs.gradle.org/6.8.1/release-notes.html
------------------------------------------------------------
Gradle 6.8.1
------------------------------------------------------------
Build time: 2021-01-22 13:20:08 UTC
Revision: 31f14a87d93945024ab7a78de84102a3400fa5b2
Kotlin: 1.4.20
Groovy: 2.5.12
Ant: Apache Ant(TM) version 1.10.9 compiled on September 27 2020
JVM: 11.0.1 (Oracle Corporation 11.0.1+13)
OS: Mac OS X 10.15.7 x86_64
정리하자면, wrapper 태스크에서는 gradle wrapper를 사용할 수 있도록 구성을 해주고
실제 wrapper( gradlew )를 수행을 하면, gradle wrapper 구성에 따라 동작을 하게 됩니다.
그래서 실제 빌드에 10초가 걸렸던 작업이 gradle 버전 속성을 변경하여 다시 빌드를 하게 되면
새로운 gradle을 다운로드하는 시간이 추가되어 10~20초씩 더 걸리게 되는 것을 확인 하실수 있습니다.( 네트워크 상황에 따라 다름 )