본문 바로가기
Gradle

Gradle copyDependencies task 생성 및 사용

by codeok 2024. 4. 27.
반응형

Gradle을 사용하면서 gradle의 dependencies로 사용하고 있는 의존성 jar들을 복사하는 방법과 task를 만들어서 진행하는 방법에 대해서 알아보겠습니다.

 

Maven에서는 mvn dependency:copy-dependencies라는 방법을 통해서 target/ 영역에 사용하는 jar들을 다운로드할 수 있습니다.

Gradle에서는 별도로 jar 복사하는 방법을 제공해주지 않아서 직접 task를 만들어야 합니다.

 

해당 포스팅에서는 gradle 버전을 7.5을 사용했습니다.

Spring Boot + Gradle 프로젝트는 있다고 가정을 하고 진행하겠습니다. 

 

 

build.gralde copyDependencies 추가

copyDependencies task를 작성할려면 build.gradle에 3가지 내용을 추가해주셔야 합니다.

  1. plugins에 id 'java-library' 추가 
  2. configuration.implementation, api의 canBeResolved true 추가
  3. task copyDepenencies 추가
plugins {
    id 'org.springframework.boot' version '2.4.4'
    id 'io.spring.dependency-management' version '1.0.11.RELEASE'
    id 'java'
    id 'java-library'
}

group = 'org.example'
version = '1.0-SNAPSHOT'
sourceCompatibility = '11'

configurations {
    compileOnly {
        extendsFrom annotationProcessor
    }
}

repositories {
    mavenCentral()
}

configurations.implementation.canBeResolved=true
configurations.api.canBeResolved=true

task copyDependencies(type: Copy) {
    from configurations.api
    from configurations.implementation
    into "$buildDir/dependencies"
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'

    compileOnly 'org.projectlombok:lombok'
    annotationProcessor 'org.projectlombok:lombok'

    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

test {
    useJUnitPlatform()
}

 

 

plugins에 id 'java-library' 추가 

java-library라는 플러그인이 있어야 api 태그를 정상 사용이 가능합니다.

plugins {
    id 'java-library'
}

 

configuration.implementation, api의 canBeResolved true 추가

configurations.~.canBeResolved=true 설정이 있어야 task copyDependencies에서 from 구문에 configurations.api와 configurations.implementation이 정상 동작이 가능합니다.

configurations.implementation.canBeResolved=true
configurations.api.canBeResolved=true

 

 

task copyDependencies 추가

task CopyDependencies를 작성해줍니다. 이름은 원하시는 이름으로 taks를 작성해주셔도 됩니다.

from 구문은 build.gradle dependencies{}에 api, implementation으로 작성되어 있는 의존성들을 가져온다는 의미입니다.

into 구문은 라이브러리들을 복사하는 target 경로입니다. 

into 구문에 $buildDir는 gradle의 변수로 현재 프로젝트의 위치에서 /build 디렉터리를 말합니다.

프로젝트로 예시로 들면 project-name/build/dependencies 경로입니다.

task copyDependencies(type: Copy) {
    from configurations.api
    from configurations.implementation
    into "$buildDir/dependencies"
}

 

 

gradle copyDependencies 실행

저는 IDE(이클립스, 인텔리제이)로 실행하지 않고 git bash에서 명령어를 실행하겠습니다.

gradle copyDependencies를 실행할 프로젝트로 이동을 해서 ./graldew copyDependencies 명령어를 입력해 줍니다.

BUILD SUCCESFUL이 나오면 build/dependencies를 조회해 봅니다.

gralde 명령어를 사용하시려면 환경변수로 지정해 주시면 사용 가능합니다.

저는 Spring boot + gradle 프로젝트의 내장 gradle을 사용하기 위해서 ./gradlew 명령어를 사용했습니다.

./gradlew 명령어는 내부의 gradlew를 실행하는 거라 환경변수로 지정하지 않고 사용 가능합니다.

ll

./gradlew copyDependencies

ll build/dependencies/

 

정상적으로 task가 실행이 되면 jar 라이브러리들이 복사된 것을 볼 수 있습니다.

 

정리

gradle의 copyDependencies task를 직접 작성해서 사용하는 방법에 대해서 알아봤습니다.

 

 

감사합니다.

반응형