Gradle

[Gradle] Gradle - Task개념 및 jar 생성 후 복사하기(.feat Copy)

디벨로펄 2024. 1. 31.
반응형

gradle 아이콘

 

Gradle은 Maven과 함께 많이 사용되는 빌드툴입니다.

Task를 Custom하여 jar파일 생성 후 해당 파일을 원하는 경로에 복사하는 것까지 진행해보겠습니다.

Task에 대해서 https://docs.gradle.org/current/userguide/tutorial_using_tasks.html

 

 

Task란?

빌드로 수행되는 하나의 독립적인 유닛으로,

compile, jar생성, javadoc생성, publish모두 Task의 일종입니다.

→ build script나, plugin으로부터 Task를 가져올 수 있습니다.

 

아래는 java라는 플러그인을 호출하면, java와 관련된 task를 활용할 수 있습니다.

plugins {
    id 'java'
}

 

현재 활용 가능한 task는 터미널에서 ./gradlew tasks로 확인할 수 있습니다.

// gradlew파일이 있는 위치에서 ./gradlew tasks


Build tasks
-----------
assemble - Assembles the outputs of this project.
build - Assembles and tests this project.
buildDependents - Assembles and tests this project and all projects that depend on it.
buildNeeded - Assembles and tests this project and all projects it depends on.
classes - Assembles main classes.
clean - Deletes the build directory.
jar - Assembles a jar archive containing the classes of the 'main' feature.
testClasses - Assembles test classes.

Build Setup tasks
-----------------
init - Initializes a new Gradle build.
...

 

Task의 분류

1. Actionable  Task : 액션이 있는 task로 compileJava와 같은 task

2. Lifecycle task : 액션이 없는 task로 assemble, build와 같은 task

일반적으로 Lifecycle Task는 Actionable Task에 의존하며, 여러 task를 한 번에 실행하기 위해 사용됩니다.

 

Tasks.named(태스크명) - 태스크 설정

이미 등록된 Task에 대해 추가로 configuration 설정 등 처리를 접근해야할 때가 있습니다.

그 때, tasks.named("task명")으로 접근해서 설정할 수 있습니다.

tasks.register("developer"){
    print("Hello World!") //1. 여기는 바로 실행되는 부분
    doLast {
        print "good bye" //3. doLast라 마지막에 실행
    }
}

tasks.named("developer"){
    doFirst {
        print "hello developer\n" //2. doFirst라 처음에 실행
    }
}

실행결과는 아래와 같습니다. 아래 내용에 대해 더 알고 싶으시면, 다음 링크를 참고하세요~!
(https://docs.gradle.org/current/userguide/build_lifecycle.html)

Hello World!

> Task :developer
hello developer
good bye

 

Task 등록 및 실행

아래와 같이 등록하면, Intellij의 경우 오른쪽 gradle 도구에서 확인이 가능합니다.

tasks.register("developer"){
    print("Hello World!")
}

tasks.register({등록하는 action의 이름}){
	// 실행되는 액션
}

생성된 task(좌)/ 실행결과(우)

실행을 위해서는 developer task를 더블클릭하여 실행하거나, ./gradlew developer 명령어로 실행할 수 있습니다.

 

Task Dependencies - Task간 의존관계 형성

dependsOn키워드를 활용해 Task간에 의존관계를 형성하는 것도 가능합니다.

tasks.register("developer"){
    print("Hello World!\n") // 2. 1에 이어서 실행
    doLast {
        print "good bye" //6. doLast 때문에 6번째로 실행
    }
}

tasks.register("manager"){
    doLast{
        print "manager : hello" // 7. developer의 doLast이후 처리
    }
    dependsOn tasks.developer // 1. developer task이후에 manager실행
    dependsOn tasks.designer // 3. designer task이후 manager 실행
    print("Hello Team!\n")  // 5. 읽히면서 바로 실행됩니다.
}
tasks.register("designer"){
    print("Hello Design!\n") // 4.designer task가 실행되면서 실행
}

 

 

아래 실행 결과를 보면서 대략적인 감을 잡으실 수 있습니다.

// 실행 결과
Hello World!
Hello Design!
Hello Team!
> Task :designer UP-TO-DATE

> Task :developer
good bye
> Task :manager
manager : hello

 

jar 생성 및 Copy Task : Custom Task 

gradle의 task는 모두 Task의 하위 클래스로, taskextends해서 customTask를 만들 수 있습니다.

built in task Type에는 Copy, GroovyDoc, Zip, Jar, JacocoReport, Sign, or Delete등이 있으며, 여기서는 Copy를 활용하겠습니다.

 

tasks.register("jarAndCopy",Copy) { //task명 : jarAndCopy
    from jar // jar task를 실행하여 생성한 파일(jar)을
    into "C:/DP/" // 아래 경로에 복사합니다. 
}
tasks.register("copyTask",Copy) {
    from("source") // source 디렉터리에 있는 파일을
    into("target") // target 디렉터리로 옮깁니다.
    include("*.war") // 옮기는 파일은 .war파일입니다.
}

 

하위 모듈의 개수가 늘어나고, 관련 jar을 여러 플랫폼에서 사용한다면, copy를 활용하는 것도 좋은 방법이 될 수 있습니다.

 

도움이 되셨길 바랍니다.

참고

Gradle Docs

https://docs.gradle.org/current/userguide/tutorial_using_tasks.html

 

반응형

댓글