2. Gradle 의등장
Java에서는 "빌드 도구"에 의한 프로젝트 관리가 보급되어 있
었습니다.
처음에는 확장성이 강력한 Apache Ant라는 빌드도구가
2000년에 등장하였고,
이후에는 설정이 편하고 중앙 저장소를 가진 Apache Maven
이라는 등장하였습니다.
사람들은 강력하지만 설정하기 어려운 Ant와 편리하지만 커스
터마이징하기 어려운 Maven 사이에서 아쉬움을 느꼈습니다.
3. 2004년
아파치에서 Apache Ivy라는 새로운 빌드 도구를 선보였지만
시장의 반응은 좋지 못했습니다.
이후 3년 뒤
우리는 Gradle을 만나게 됩니다.
Gradle은 그루비 언어를 기반으로 쉽게 설정할 수 있으며 다양
한 기능을 추가할 수 있었고 자바 세상의 주류로 편입하게 됩니
다.
5. 간결함
Groovy라는 언어를 활용한 DSL을 스크립트로 사용한다.
Groovy라는 언어를 몰라도 Gradle 스크립트에 익숙해 질 수
있다.
속도
Gradle은 성능을 위해서 다양한 기능을 제공한다.
Gradle은 성능 향상을 위해서 증분 빌드, 작업 결과 캐싱, 증분
하위 작업, 데몬 프로세스 재사용, 별렬 실행, 병렬 다운로드 등
의 기능을 지원한다.
6. 멀티프로젝트
Gradle은 멀티 프로젝트 구성이 가능하다. 하나의
Repository내에 여러개의 하위 프로젝트를 구성할 수 있다.
상위 프로젝트의 의존성 및 설정을 하위 프로젝트에서 상속받
아 사용할 수 있기 때문에 중복 설정이 불필요하다.
유연성+ 확장성
Groovy 기반 스크립팅을 통해서 다양한 기능을 스크립트안에
직접 구현할 수 있다.
직접 Task를 구현하고, 플로그인을 만들어서 기능을 추가할 수
도 있다.
7. 기본설정
$ gradle init
project/
gradlew // 유닉스용 실행 스크립트.
gradlew.bat // 윈도우용 실행 배치 스크립트
gradle/wrapper/
gradle-wrapper.jar // gradlew 파일이 프로젝트 내에 설치하는 이 파
gradle-wrapper.properties // gradle wrapper 설정 파일
build.gradle // 읜존성이나 플러그인 설정 등을 위한 스크립트 파일
settings.gradle // 프로젝트의 구성 정보를 기록하는 파일
8. 멀티프로젝트구성
기본적인 프로젝트 구조를 설정
// settings.gradle
rootProject.name = 'algorithm' // 최상위 프로젝트 이름
include 'java'
include 'kotlin'
$ mkdir java
$ mkdir kotlin
$ mkdir -p java/src/main/java
$ mkdir -p kotlin/src/main/kotlin
9. 각 하위 폴더를 Gradle 프로젝트로 만들기
$ touch java/build.gradle
$ touch kotlin/build.gradle
최상위 프로젝트의 build.gradle 파일에 모든 하위 프로젝트
에 적용되는 공통 설정을 적용
subprojects {
group = 'gradle-study' // 생성될 아티팩트의 그룹명
repositories {
mavenCentral()
}
dependencies {
}
}
10. subprojects 내의 설정 값들은 모든 하위 프로젝트에 적용되
며
만약 최상위 프로젝트를 포함한 모든 하위 프로젝트에 공통적
으로 적용하고 싶다면
allprojects를 사용할 수 있다.
11. Java용프로젝트설정
// java/build.gradle
apply plugin: 'java' // 'java'라는 Gradle 플러그인 적용
sourceCompatibility = 1.8 // Java 호환 버전을 1.8로 설정
dependencies {
compile 'ch.qos.logback:logback-classic:1.2.3'
compile 'ch.qos.logback:logback-core:1.2.3'
testCompile 'junit:junit:4.12'
}
위 설정은 java 폴더 하위의 프로젝트에만 적용된다.
12. // java/src/main/java/HelloWorld.java
import java.util.Scanner;
class HelloWorld {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int cases = sc.nextInt();
for (int i = 0; i < cases; i++) {
String name = sc.next();
System.out.println("Hello, " + name + "!");
}
}
}
$ ./gradlew build
19. 프로젝트/모듈/build.gradle
어플리케이션에서 사용할 패키지 설정
implementation project(':모듈명') // 같은 프로젝트 모듈 의존
implementation '저장소 명' // 외부 저장소로부터 의존
implementation files('파일명') // 같은 모듈 내 라이브러리 파일 의존
20. Gradle 스크립트의이해
Gradle 스크립트는 Groovy를 사용해서 만든 DSL이다.
모든 Gradle 스크립트는 두가지 개념으로 구성되어 있는데
projects와 tasks 이다.
모든 Gradle 빌드는 하나 시상의 projects로 구성된다. 그리
고 각 projects는 하나 이상의 tasks들로 구성되어있다.
이 task는 어떤 클래스를 컴파일하거나 JAR를 생성하거나
javadoc을 만드는 작업들을 의미한다.
21. task hello {
doLast {
println 'Hello World'
}
}
간단한 hello task를 위와 같이 만들 수 있다.
$ gradle -q hello
로 해당 task만 실행해 볼 수도 있다.
22. task hello {
doLast {
println 'Hello world!'
}
}
task intro(dependsOn: hello) {
doLast {
println "I'm Gradle"
}
}
dependsOn을 사용해서 task간의 의존성을 만들 수 있다. 위
예제의 경우 intro task를 실행하면 먼저 hello가 실행되고
intro가 실행된다.