본문 바로가기

Build/Gradle

Gradle 도큐먼트: Gradle 플러그인(Plugins) 적용하기

더보기

Gradle 플러그인(Plugins)은 빌드에 필요한 비즈니스 로직을 구성하고 프로젝트 내에서 재사용하기 위한 목적으로 사용됩니다.

또한 사용자가 작성한 Task를 패키지로 구성하여 배포하기 위해서도 사용 할 수 있습니다.

플러그인을 프로젝트에 적용하면 Task를 생성하고 프로퍼티를 구성하는 등 프로젝트의 기능을 확장하기 위한 코드가 실행됩니다.

이 문서의 시작에 앞서 이 블로그의 문서: 의존성(Dependencies) 관리를 선행해야 합니다.

일반적으로 플러그인은 Gradle API를 사용해 추가 기능을 제공하고 Gradle의 핵심 기능을 확장하도록 도와줍니다.

플러그인을 사용하면:

  • 프로젝트에 새로운 Task를 추가합니다(e.g. 컴파일, 테스트를 위한).
  • 기본으로 제공되는 Gradle 모델을 확장합니다(e.g. 구성 가능한 DSL-Domain Specific Languages 모델의 추가).
  • 규칙에 따라서 프로젝트를 구성합니다.
  • 특정 구성을 적용합니다(e.g 리포지토리 추가 등) 등.

플러그인 적용 방법

예제 tutorial 프로젝트는 Gradle 번들에서 제공하는 Application Plugin이라는 플러그인이 적용되어 있습니다.

빌드 스크립트 파일 build.gradle.kts를 열고 다음을 확인합니다.

plugins {
    // Apply the application plugin to add support for building a CLI application in Java.
    application
}

tutorial 프로젝트에 Maven Publish Plugin을 새로 적용해보도록 하겠습니다.

더보기

Maven Publish Plugin은 빌드 아티팩트를 Apache Maven Repository에 게시하는 기능을 제공합니다.

또한 원격 저장소가 아닌, 시스템에 위치한 로컬 저장소 메이븐 로컬(Maven local)에도 게시 할 수 있습니다. Maven 로컬 리포지토리의 기본 위치는 일반적으로 다음과 같습니다.

macOS Linux Windows
/Users/\[username]/.m2 /home/\[username]/.m2 C:\Users\[username]\.m2

Maven 리포지토리를 대상으로 하는 게시물은 일반적으로 하나 또는 그 이상의 아티팩트 Gradle 모듈에 대한 메타데이터 Maven POM 파일을 포함합니다.

build.gradle.kts 파일의 plugin 블록에 maven-publish를 추가합니다.

plugins {
    // Apply the application plugin to add support for building a CLI application in Java.
    application
    `maven-publish`
}

IntelliJ IDEA에서 Gradle을 Sync합니다.

이제 새로 사용 가능한 Task를 찾아봄으로써 플러그인이 정상적으로 적용되었는지 확인합니다.

명령줄에서 ./gradlew :app:tasks를 실행합니다.

$ ./gradlew :app:tasks

> Task :app:tasks

------------------------------------------------------------
Tasks runnable from project ':app'
------------------------------------------------------------

...

Publishing tasks
----------------
publish - Publishes all publications produced by this project.
publishToMavenLocal - Publishes all Maven publications produced by this project to the local Maven cache.

이제 publishpublishToMavenLocal 새로운 Task를 사용 할 수 있게 됩니다.

IntelliJ IDEA | Gradle에서도 플러그인으로 새로 추가된 Task를 확인 할 수 있습니다.

Maven Publish 플러그인 구성하기

빌드 스크립트 파일 build.gradle.kts를 열고 다음을 작성합니다.

publishing {
    publications {
        create<MavenPublication>("maven") {
            groupId = "org.gradle.tutorial"
            artifactId = "tutorial"
            version = "1.0"

            from(components["java"])
        }
    }
}

명령줄에서 ./gradlew :app:tasks를 실행합니다.

플러그인에 추가 정보를 제공함으로써 새로운 Task가 추가된 것을 확인 할 수 있습니다.

$ ./gradlew :app:tasks

> Task :app:tasks

------------------------------------------------------------
Tasks runnable from project ':app'
------------------------------------------------------------

...

Publishing tasks
----------------
generateMetadataFileForMavenPublication - Generates the Gradle metadata file for publication 'maven'.
generatePomFileForMavenPublication - Generates the Maven POM file for publication 'maven'.
publish - Publishes all publications produced by this project.
publishMavenPublicationToMavenLocal - Publishes Maven publication 'maven' to the local Maven repository.
publishToMavenLocal - Publishes all Maven publications produced by this project to the local Maven cache.

Maven Publish 플러그인 사용하기

명령줄에서 ./gradlew :app:publishToMavenLocal을 실행하여 새로 추가된 publishToMavenLocal Task를 수행합니다.

$ ./gradlew :app:publishToMavenLocal

> Task :app:compileJava FROM-CACHE
> Task :app:processResources NO-SOURCE
> Task :app:classes UP-TO-DATE
> Task :app:jar
> Task :app:generateMetadataFileForMavenPublication
> Task :app:generatePomFileForMavenPublication
> Task :app:publishMavenPublicationToMavenLocal
> Task :app:publishToMavenLocal
BUILD SUCCESSFUL in 331ms

publishToMavenLocal Task는 POM 파일과 아티팩트를 빌드하고, 로컬 Maven 리포지토리에 올립니다.

빌드된 내용은 app/build/publications/maven 디렉토리에서 확인 할 수 있습니다.

$ cd app/build/publications/maven 
$ ls
module.json	pom-default.xml

로컬 Maven 리포지토리에 올라간 빌드 파일은 /Users/[사용자 이름]/.m2/repository/org/gradle/tutorial/tutorial에서 확인 할 수 있습니다.

$ cd /Users/[사용자 이름]/.m2/repository/org/gradle/tutorial/tutorial
$ tree
.
├── 1.0
│   ├── tutorial-1.0.jar
│   ├── tutorial-1.0.module
│   └── tutorial-1.0.pom
└── maven-metadata-local.xml

1 directory, 4 files

1.0/tutorial-1.0.pom 파일을 열면 Maven Publish 플러그인을 구성하기 위해 작성한 프로퍼티와 관련 종속성을 확인 할 수 있습니다.

<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <!-- This module was also published with a richer model, Gradle metadata,  -->
  <!-- which should be used instead. Do not delete the following line which  -->
  <!-- is to indicate to Gradle or any Gradle module metadata file consumer  -->
  <!-- that they should prefer consuming it instead. -->
  <!-- do_not_remove: published-with-gradle-metadata -->
  <modelVersion>4.0.0</modelVersion>
  <groupId>org.gradle.tutorial</groupId>
  <artifactId>tutorial</artifactId>
  <version>1.0</version>
  <dependencies>
    <dependency>
      <groupId>com.google.guava</groupId>
      <artifactId>guava</artifactId>
      <version>32.1.2-jre</version>
      <scope>runtime</scope>
    </dependency>
  </dependencies>
</project>
코드 비고
Line 10:12 groupId Maven Publish 플러그인을 구성하는 과정에서 입력한 프로퍼티와 매핑됩니다.
artifactId
version
Line 13:20 dependencies 이 모듈이 필요로하는 의존성입니다.

플러그인 작성자는 플러그인을 공개 또는 비공개로 배포 할 수 있습니다.

일반적으로 플러그인은 다음 세 가지 방식으로 배포됩니다.

  • Core Plugins: Gradle 개발사에서 배포하고 유지보수하는 플러그인입니다.
  • Gradle Plugin Portal: 커뮤니티 플러그인으로써 Gradle 커뮤니티가 배포하고 유지보수합니다.
  • Custom Plugins: Gradle APIs를 사용하여 사용자들이 커스텀 제작한 플러그인입니다.
더보기

Conevention Plugins은 빌드 로직을 하위 프로젝트(모듈) 간 공유하기 위한 목적으로 사용합니다.

사용자는 공통된 빌드 로직을 Convention Plugins에 래핑(Wrapping) 할 수 있습니다.

예를 들어, Convention Plugins의 code coverage plugin을 사용하면 특정 하위 프로젝트 뿐만 아니라 전체 프로젝트의 코드 커버리지를 조사 할 수 있습니다.

정리 및 복습

  • Gradle 플러그인(Plugin)을 사용하면 빌드에 필요한 비즈니스 로직을 구성하고 프로젝트에서 재사용 할 수 있습니다.
  • 플러그인을 추가하려면 빌드 스크립트 파일 build.gradle.kts에서 plugins 블록을 편집합니다.
plugins {
    // Apply the application plugin to add support for building a CLI application in Java.
    application
}
  • 플러그인을 적용하고 IntelliJ IDEA | Gradle | Sync를 실행하면 새로운 플러그인이 제공하는 Task가 추가됩니다.
  • 일반적으로 플러그인이 배포되는 경로는 다음 세 가지로 구분됩니다.
Core Plugins Gradle Plugin Portal Custom Plugins
Core Plugins은 Gradle 개발사에서 배포하고 유지보수하는 플러그인입니다. Gradle Plugin Portal은 커뮤니티 플러그인으로서 Gradle 커뮤니티가 배포하고 유지보수합니다. Gradle APIs를 사용하여 사용자들이 커스텀 제작한 플러그인입니다.