Gradle의 모든 포스팅은 유튜브 프리렉을 기반으로 작성되었습니다.
링크 : https://www.youtube.com/watch?v=s-XZ5B15ZJ0&list=PL7mmuO705dG2pdxCYCCJeAgOeuQN1seZz
강의의 버전이 옛버전 이기 때문에 이론적인 부분만 학습하는것이 좋습니다.
의존관계 관리
의존 관계 관리 참조 사이트
https://docs.gradle.org/current/userguide/artifact_dependencies_tutorial.html
Managing Dependencies of JVM Projects
How does Gradle know where to find the files for external dependencies? Gradle looks for them in a repository. A repository is a collection of modules, organized by group, name and version. Gradle understands different repository types, such as Maven and I
docs.gradle.org
의존 관계 관리 목적
목적 | 설명 |
의존 관계 해결 자동화 | 설정 지정을 통하여 특정 위치에서 필요한 라이브러리를 내려받거나 복사하여 추가 |
전이적 의존 관계 관리 | 외부의 라이브러리나 프로젝트 등이 추가로 다른 외부의 라이브러리나 프로젝트가 필요한지를 파악하거나 관리 |
의존 관계 표시 | 프로젝트가 특정 외부 라이브러리의 어떤 버전에 의존하는지 여부 표시 |
의존 관계 관리
// build를 위한 환경 구성/환경 설정
configurations {
conf1
}
// 의존관계 정의
dependencies {
conf1 gradleApi() // 의존관계 지정
}
task exeTask << {
// 설정된 환경 구성을 사용
configurations.conf1.each{
println it.absolutePath
}
}
임의의 프로젝트 생성 후 build.gradle 파일에 해당 소스코드를 입력
gradle exeTask 실행결과
>Task :exeTask
C:\Users\hwu\.gradle\caches\7.0\generated-gradle-jars\gradle-api-7.0.jar
C:\Gradle\gradle-7.0\lib\groovy-all-2.4.11.jar
C:\Gradle\gradle-7.0\lib\gradle-installation-beacon-7.0.jar
해당 프로젝트가 참조하고 있는 라이브러리에 대한 정보들이 출력되는것을 확인 가능
순서
의존관계 지정 방법
지정 방법 | 설명 |
외부 모듈 의존 관계 지정 | 인터넷 저장소에 대하여 의존 관계 지정(저장소 정의 필요) |
파일 의존 관계 지정 | 파일 시스템의 파일에 대하여 의존 관계 지정 |
프로젝트 의존 관계 지정 | 특정 프로젝트에서 다른 프로젝트에 대하여 의존 관계 지정 |
Gradle API 의존 관계 지정 | 사용중인 API가 포함된 라이브러리 파일에 대하여 의존 관계 지정 |
로컬 그루비 의존 관계 지정 | 현재 사용 중인 그루비에 대하여 내장된 라이브러리를 의존 관계 지정 |
일반적인 형식 (외부모듈 지정 방식)
'그룹명', '모듈명', '버전 번호'
dependencies {
conf1 'ch.qos.logback:logback-classic:1.0.13'
// 환경구성 그룹명:모듈명:버전정보
conf1 'org.springframework:spring-orm:4.0.2.RELEASE'
conf1 (group: 'org.gradle.api.plugins', name: 'gradle-cargo-plugin', version:'0.6.1')
} // group:'', name: '', version: ''
임의의 프로젝트 생성 후
// 환경구성 정의
configurations {
conf1
}
// 저장소 정의
repositories {
mavenCentral()
}
// 의존관계 정의
dependencies {
// 외부 모듈 의존 지정
conf1 'ch.qos.logback:logback-classic:1.0.13'
conf1 'org.springframework:spring-orm:4.0.2.RELEASE'
conf1(group:'org.gradle.api.plugins',name:'gradle-cargo-plugin',version:'0.6.1')
}
task exeTask <<{
configurations.conf1.each{
println it.absolutePath
}
}
gradle exeTask 실행결과
> exeTask
참조하고 있는 라이브러리 경로들이 출력
파일의 의존관계
특정 라이브러리나 파일을 지정하여 의존관계 정의
// 환경구성 정의
configurations {
conf1
}
// 의존관계 정의
dependencies {
//1. 파일 의존관계 - 특정 파일이나 라이브러리 지정
conf1 files("lib/commonLib.jar")
//2. 파일 의존관계 - 디렉터리 지정
conf1 fileTree(dir:"lib", include:"**/*.jar")
}
task exeTask <<{
configurations.conf1.each{
println it.absolutePath
}
}
특정 프로젝트에서 다른 프로젝트를 참조하는 경우
project API이용하여 지정하고자 하는 프로젝트를 콜론 ( : ) 을 이용하여 계층적으로 구분하여 사용
// 환경구성 정의
configurations {
conf1
}
// 의존관계 정의
dependencies {
// project 의존관계
compile project(':subProject')
conf1 'ch.qos.logback:logback-classic:1.0.13'
}
task exeTask <<{
configurations.conf1.each{
println it.absolutePath
}
}
멀티 프로젝트에서 root프로젝트를 기준으로 sub프로젝트를 지정하고자 할때 사용한 예
gralde API를 이용한 의존관계 설정
관련 메소드를 환경 설정을 위한 변수에 정의하여 사용하면 된다.
관련 API가 지정한다고 무조건 의존관계를 정의할 수 있는것은 아니다.
// 환경구성 정의
configurations {
conf1
}
// 의존관계 정의
repositories {
mavenCentral()
}
apply plugin: 'groovy'
dependencies{
// gradle api 의존관계
conf1 gradleApi()
// local groovy 의존관계
conf1 localGroovy()
}
task exeTask <<{
configurations.conf1.each{
println it.absolutePath
}
}
local groovy를 사용하기 위해서는 apply plugin:'groovy'를 이용하여 지정해야한다. 그 후 의존관계 지정 가능
실행결과를 확인해보면 gradleApi뿐만 아니라 localGroovy에 대해서도 의존관계가 형성되어 있다.
시간이 경과함에 따라 프로젝트에서 의존관계를 형성하고 있는 라이브러리의 버전이
새롭게 출시, 변경될 경우 라이브러리의 버전을 동적으로 관리하는 방법
전체 스크립트 코드는 생략
(생략)
// 변경성 모듈에 대한 캐시 간격 지정
// 시간간격을 통해서 환경설정 부분을 제어
configurations.confDef.resolutionStrategy.cacheDynamicVersionsFor 10, 'minutes'
configurations.confDef.resolutionStrategy.cacheChangingModulesFor 10, 'hours'
(생략)
// 의존관계 정의
dependencies {
// 버전 중 최신 버전에 대한 지정
confDef 'org.slf4j:slf4j-api:1.+' // 현재 1.이라고 시작하는 최신버전을 사용하겠다 라는 의미
// 출시 버전 중 최신 버전에 대한 지정
confDef 'commons-cli:commons-cli:latest.integration'
// 배포된 버전 중 최신 버전에 대한 지정
confDef 'junit:junit:latest.release'
}
(생략)
해당 라이브러리 버전간의 충돌이 발생할 때
라이브러리의 파일들이 복합적으로 구성된 구성들 사이에서 동일한 라이브러리로 인한 버전 충돌이 발생할 수 있다
예) jdk버전과의 충돌
gradle에서는 이러한 문제를 방지하기 위해서 같은 종류의 라이브러리가 있을 때
가장 최신 버전에대한 라이브러리를 참조하도록 의존관계가 관리되고있다.
버전이 충돌할 경우 해결방법 2가지
방법 | 설명 |
Newest 정책 | 버전이 충돌할 경우 최신 버전을 사용 |
Fail 정책 | 버전이 충돌할 경우 오류를 발생시켜 빌드가 실패하도록 함 |
Fail 정책
// 환경구성 정의
configurations {
confDef
// 환경구성 상속
newConfDef.extendsFrom confDef
}
configurations.newConfDef{
resolutionStrategy{
failOnVersionConflict() // 예외처리
}
}
resolutionStrategy 블록을 지정하여 예외처리
exclude 키워드를 이용해서 해당 모듈을 직접적으로 제외
dependencies{
...(생략)...
testConf1(group: 'org.spockframework', name:'spock-core', version:'0.7-Groovy-2.0'){
exclude module:'Groovy-all'
}
}
특정 버전을 사용할 수 있도록 지정
Fail정책 사용 시 특정 버전을 사용할 수 있도록 강제적 지정
force API 이용
// Fail 정책 사용
configurations.testConf1 {
resolutionStrategy{
failOnVersionConflict()
// 버전 사용 강제적 지정 부분
force 'org.codehaus.Groovy:Groovy-all:2.3.1'
}
}
환경 구성 정의
configurations 블록
환경 구성이 정의가 되어 환경구성 간에 상속을 이루어서 사용 가능
repositories {
jcenter() // https://jcenter.bintray.com/
}
configurations {
conf1
testConf1.extendsFrom conf1
}
dependencies {
conf1 group:'org.codehaus.groovy', name:'groovy-all',version:'2.3.1'
testConf1 group:'junit', name:'junit', version:'4.11'
}
task exeTask <<{
configurations.testConf1.each{
println it.absolutePath
}
}
gradle exeTask실행결과
Conf1에 지정되어 있던 환경구성 정보가
testConf1에 extendsFrom이란 키워드를 통해서 환경구성 정보가 상속되어 그정보가 출력됨
저장소 정의
저장소는 repositories 블록으로 정의한다
저장소
gradle은 maven저장소를 사용할 수 있으며 maven 저장소를 이용하여 저장소를 정의 가능
gradle에서는 maven저장소를 비롯하여 id저장소나 maven local저장소 등등의 저장소를 사용할 수 있다
maven 저장소
오픈소스 라이브러리나 maven plugin, maven 아키타입을 관리하는 저장소로
최상위 저장소로 말할 수 있다. 그래서 개발자가 라이브러리를 임의로 배포할 수 없는 특징을 가진 저장소이다.
maven 아키타입이란?
maven에서 나만의 템플릿 또는 보일러 플레이트를 제작하는 방법이다.
자주 사용하는 코드를 나만의 것으로 만드는것
// 메이븐 저장소
repositories {
mavenCentral()
}
// 메이븐 저장소 URL
repositories{
maven{
url"http://repo1.maven.org/maven2"
}
}
메이븐 로컬 저장소
중앙 저장소나 원격 저장소에서 다운받은 파일들을 저장하고 관리하는 역할을 한다.
// 메이븐 로컬 저장소
repositories {
mavenLocal()
}
=>USER_HOME/.m2/repository // 경로
Jcenter 메이븐 저장소
빈트레이에서 제공하는 저장소를 사용하는 것으로서 원격저장소로 볼 수 있다.
단체나 사내등의 할당받은 공간에서 라이브러리 파일들을 배포하거나 저장하고 관리할 수 있는 저장소
repositories{
jcenter()
}
gradle에서는 maven 저장소 뿐만 아니라
ivy 저장소를 사용할 수 있는데 사용방법은 메이븐 저장소와 비슷하다.
IVY 저장소 사용
// IVY 저장소
repositories{
ivy{
url"http://"
layout"maven" // 메이븐과 같은 저장소 디렉터리 구조 지정
}
}
로컬 디렉터리 저장소 사용
// 로컬 디렉터리 저장소 사용
repositories{
flatDir{
dirs"local_lib","introHtml" // 로컬 디렉터리 지정
}
}
'프로그래밍 공부 > Gradle' 카테고리의 다른 글
Gradle 퍼블리싱 압축하기 zip tar jar war ear (0) | 2021.09.09 |
---|---|
Gradle 테스트 자동화 환경 차이 제어, 패턴을 이용한 테스트, Junit, 병렬 테스트 (0) | 2021.09.08 |
Gradle의 파일처리 파일관리 파일참조, 파일복사, 파일삭제 (0) | 2021.09.06 |
Gradle의 도메인 객체 Project, Task, Gradle, Settings, 기타 (0) | 2021.09.05 |
Gradle의 태스크(task) 10. Gradle의 태스크 그래프 (0) | 2021.09.03 |