ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Gradle] Gradle 과 JVM 관계 알아보기 ( 간단한 Task 생성하기 )
    Java/Gradle 2024. 2. 17. 17:49
    반응형

    - 목차

     

    들어가며.

    이번 글에서는 Gradle 의 동작 방식을 알아보기 위해서 build.gradle 내부에 간단한 Task 를 생성 후 실행해보도록 합니다.

     

    Gradle 과 JVM 관계.

    먼저 Gradle 이 JVM 위에서 어떤 식으로 동작하는지 알아보기 위해서 Gradle Docker Container 를 실행합니다.

     

    docker run -it --rm --name gradle gradle bash

     

    그리고 이 Gradle Docker Container 내부에서 간단한 Task 를 생성 후 실행합니다.

    아래의 간단한 예시는 build.gradle 파일을 생성하며, 이 파일은 300초 동안 실행되도록 작성하였습니다.

     

    cat <<'EOF'> ./build.gradle
    task delayedTask {
        println "Task 시작"
        Thread.sleep(300000)
        println "300초 후 Task 완료"
    }
    EOF
    
    gradle delayedTask

     

     

    그 후에 ps aux, ps -ef 등의 명령을 통해서 어떤 프로세스들이 실행 중인지 확인하였습니다.

    요약된 내용이긴한데, 아래와 같이 2개의 JVM Process 들이 실행됩니다.

    1. org.gradle.launcher.GradleMain 
    2. org.gradle.launcher.daemon.bootstrap.GradleDaemon

     

    /opt/java/openjdk/bin/java 
    -Xmx64m 
    -Xms64m 
    -javaagent:/opt/gradle/lib/agents/gradle-instrumentation-agent-8.12.jar 
    -Dorg.gradle.appname=gradle 
    -classpath /opt/gradle/lib/gradle-gradle-cli-main-8.12.jar 
    org.gradle.launcher.GradleMain 
    delayedTask
    
    
    /opt/java/openjdk/bin/java 
    --add-opens=java.base/java.lang=ALL-UNNAMED 
    --add-opens=java.base/java.lang.invoke=ALL-UNNAMED 
    --add-opens=java.base/java.util=ALL-UNNAMED 
    --add-opens=java.prefs/java.util.prefs=ALL-UNNAMED 
    --add-exports=jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED 
    --add-exports=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED 
    --add-opens=java.base/java.util=ALL-UNNAMED 
    --add-opens=java.prefs/java.util.prefs=ALL-UNNAMED 
    --add-opens=java.base/java.nio.charset=ALL-UNNAMED 
    --add-opens=java.base/java.net=ALL-UNNAMED 
    --add-opens=java.base/java.util.concurrent.atomic=ALL-UNNAMED 
    --add-opens=java.xml/javax.xml.namespace=ALL-UNNAMED 
    -XX:MaxMetaspaceSize=384m 
    -XX:+HeapDumpOnOutOfMemoryError 
    -Xms256m -Xmx512m 
    -Dfile.encoding=UTF-8 
    -Duser.country=US 
    -Duser.language=en -Duser.variant 
    -cp /opt/gradle/lib/gradle-daemon-main-8.12.jar 
    -javaagent:/opt/gradle/lib/agents/gradle-instrumentation-agent-8.12.jar 
    org.gradle.launcher.daemon.bootstrap.GradleDaemon 8.12

     

     

    첫번째로 실행되는 GradleMain 클래스는 build.gradle 의 DSL File 을 런타임에서 파싱 및 분석하여 Task 를 실행하는 프로세스입니다.

    그리고 두번째로 실행되는 GradmeDaemon 클래스는 빌드 과정의 최적화를 위해서 실행되는 데몬 프로세스라고 하네요.

    아무튼 중요한건 GradleMain 클래스가 Groovy DSL 언어로 작성된 build.gradle 의 해석 및 실행하는 JVM Process 라는 사실입니다.

     

    Task 알아보기.

    build.gradle 파일은 task 라는 단위로 실행됩니다.

    아래와 같이 간단한 task 를 생성할 수 있고, 이 내부에는 Groovy 문법의 코드가 작성될 수 있습니다.

     

    task delayedTask {
        println "Task 시작"
        Thread.sleep(3000)
        println "3초 후 Task 완료"
    }

     

     

     

    반응형

    'Java > Gradle' 카테고리의 다른 글

    [Gradle] Java Plugin 알아보기  (0) 2024.03.06
Designed by Tistory.