Gradle 빌드 파일 작성법 찾아보다가... 이 부분을 왜 이렇게 작성하는지 저걸 어케 쓰는건지 전혀 모르겠고...
혼자 화딱지나서 기초부터 차근차근 정리했다ㅠㅠ
이글저글 많이 참고했지만 가장 좋은 참고 문서는 Gradle 공식 홈페이지 같다.
영어라 읽기 힘든게 흠이지만 정말 정리가 잘 되어있음!!!
목차
1. 기본 용어
2. Gradle이란?
3. Gradle Project의 구성
3-1. Gradle Wrapper란?
4. build.gradle 살펴보기
4-1. api, compile, implementation의 차이점
1. 기본 용어
- Project: 소스를 jar 형태로 모으거나, 자바 프로젝트를 compile, 테스트 실행, 어플리케이션 deploy 등의 업무로 구성
- Task: 작업의 최소 단위
- Compile: 소스 코드를 컴퓨터가 이해할 수 있는 기계어로 변환하는 과정
- Build: 소스 코드를 실행 가능한 sw 결과물로 만드는 일련의 과정 (Compile 과정을 포함)
2. Gradle이란?
- Groovy 기반의 오픈소스 빌드 자동화 툴
- Ant -> Maven -> Gradle 순으로 발달
- xml의 구조적 틀을 벗어나 코딩에 의한 간결한 정의 가능
- 프로젝트를 설정 주입 방식으로 정의 -> Maven의 상속 구조보다 재사용에 용이
- 간결함, 속도, 유연성, 확장성, 공식 홈피에 문서화된 것이 많은 것이 장점
3. Gradle Project 구성
- gradlew: Unix용 실행 스크립트
- gradlew.bat: Windows용 실행 스크립트
- gradlew-wrapper.jar: Wrapper 파일
- gradle-wrapper.properties: Gradle Wrapper 설정 파일
- build.gradle: 의존성이나 플러그인 설정 등을 위한 스크립트 파일
- settings.gradle: 프로젝트 구성 정보 기록
3-1. Gradle wrapper란?
- 사용자가 Gradle을 설치하지 않았어도 Gradle tasks를 실행할 수 있도록 도움
- 프로젝트 생성자와 사용자가 동일한 버전의 Gradle 사용할 수 있음
4. build.gradle 살펴보기
// 플러그인 설정
apply plugin: 'java-library'
// 저장소 설정
repositories {
jcenter()
}
/* 의존 관계 설정
api, compile, implementation: 프로젝트 컴파일 과정에서 필요한 라이브러리
runtime: 프로젝트 실행 과정에서 "
testCompile, testImplementation:테스트 컴파일 과정에서 "
testRuntime: 테스트 실행 과정에서 "
*/
dependencies {
api 'org.apache.commons:commons-math3:3.6.1'
implementation 'com.google.guava:guava:23.0'
testImplementation 'junit:junit:4.12'
}
(gradle project 생성 시 설정되는 디폴트 설정에 약간의 주석만 추가했다.)
4-1. api, compile, implementation의 차이점?
- api는 compile과 동일한 동작. (apply plugin에서 'java-library'일 경우엔 api, 'java'일 경우에는 compile 사용)
- compile보단 api 키워드 사용을 권장한다.
- 공식 문서에서 api와 implementation은 다음과 같이 정의된다.
api
- The dependencies required to compile the production source of the project which are part of the API exposed by the project. For example the project uses Guava and exposes public interfaces with Guava classes in their method signatures.
- 프로젝트에 의해 노출되는 API의 일부인 프로젝트 소스를 컴파일하는데 필요한 종속성.
implementation
- The dependencies required to compile the production source of the project which are not part of the API exposed by the project. For example the project uses Hibernate for its internal persistence layer implementation.
- 프로젝트에 의해 노출되는 API의 일부가 아닌 프로젝트 소스를 컴파일하는데 필요한 종속성.
말로는 너무 어려워서 예제를 하나 준비했다.
모듈 app과 라이브러리 lib1, lib2가 있다고 가정하자.
app은 lib1을 라이브러리로 사용하고, lib1은 lib2를 라이브러리로 사용한다.
만약, lib1에서 lib2를 api로 사용한다면 app은 lib2의 코드를 볼 수 있다.
만약, lib1에서 lib2를 implementation로 사용한다면 app은 lib2의 코드를 볼 수 없다.
참조
1) www.egovframe.go.kr/wiki/doku.php?id=egovframework:dev3.6:dep:build_tool:gradle
2) api와 implementation docs.gradle.org/current/userguide/dependency_management_for_java_projects.html#sec:configurations_java_tutorial
3) api와 implementation stackoverflow.com/questions/44413952/gradle-implementation-vs-api-configuration/44419574#44419574
'Develop > etc' 카테고리의 다른 글
[Jenkins] Pipeline 이용하기 (with JUnit, SonarQube) (0) | 2021.04.26 |
---|---|
[Jenkins] PipeLine Syntax (0) | 2021.04.19 |
[Jenkins] JUnit과 연동 (0) | 2021.04.06 |
[Jenkins] Sonarqube와 연동 (2) | 2021.04.05 |
테스트 종류와 도구 (0) | 2021.03.31 |