본문 바로가기

안드로이드/멀티 모듈

[안드로이드 멀티 모듈] 11. JvmLibraryConventionPlugin 만들기


지난 포스트에서는 Room 데이터베이스를 위한 AndoridRoomConventionPlugin을 만들었습니다.

이번 시간에는 안드로이드에 의존성이 없는 모듈을 위한 JvmLibraryConventionPlugin을 만들겠습니다.
해당 플러그인은 도메인 모듈 등에서 사용하게 될 것입니다.

JvmLibraryConventionPlugin이 추가된 모습

1. configureKotlinJvm 유틸 함수 만들기

build-logic 모듈의 Kotlin 파일에 Kotlin과 JVM 설정을 하기 위한 Project.configureKotlinJvm 이라는 유틸 함수를 만들겠습니다.

configureKotlinJvm 함수Java 11을 사용하도록 설정하는 역할을 합니다. build-logic 모듈에서만 사용할 것 이므로 internal 키워드를 추가해주었습니다.

// Kotlin.kt

internal fun Project.configureKotlinJvm() {
    extensions.configure<JavaPluginExtension> {
        sourceCompatibility = JavaVersion.VERSION_11
        targetCompatibility = JavaVersion.VERSION_11
    }
    configureKotlin()
}

// 예전에 만들었던 함수
private fun Project.configureKotlin() {
    tasks.withType<KotlinCompile>().configureEach {
        kotlinOptions {
            jvmTarget = JavaVersion.VERSION_11.toString()
        }
    }
}

2. JvmLibraryConventionPlugin 만들기

그 후, JvmLibraryConventionPlugin을 아래처럼 만들었습니다. 위에서 만든 유틸함수를 호출하고 있는 모습입니다.

// JvmLibraryConventionPlugin.kt

class JvmLibraryConventionPlugin: Plugin<Project> {

    override fun apply(target: Project) {
        target.run {
            pluginManager.apply("org.jetbrains.kotlin.jvm")

            configureKotlinJvm()
        }
    }
}

3. JvmLibraryConventionPlugin 적용하기

Gradle에게 특정 id로 컨벤션 플러그인을 인식할 수 있도록 해야합니다.
libs.versions.toml 파일에 id를 정의하고 build-logic 모듈에 위에서 만든 컨벤션 플러그인을 등록합니다.

// libs.versions.toml

[plugins]
multi-module-jvm-library = { id = "multi.module.jvm.library", version = "unspecified" }
...
// build.gradle.kts (Mobule :build-logic:convention)

...

gradlePlugin {
   plugins {  
      register("jvmLibrary") {
         id = "multi.module.jvm.library"
         implementationClass = "JvmLibraryConventionPlugin"
      }
      ...
   }
}


그 후, home:domain 모듈에 해당 컨벤션 플러그인을 적용하겠습니다. 제가 만든 domain 모듈은 안드로이드에 의존성이 없는 모듈이기 때문입니다.

// build.gradle.kts (Module :home:domain)

plugins {
    alias(libs.plugins.multi.module.jvm.library)
}

4. 정리

안드로이드에 의존성이 없고 순수 Java/Kotlin로 생성된 모듈을 위한 JvmLibraryConventionPlugin을 만들었습니다.

최근 안드로이드에서는 클린 아키텍처로 구성된 프로젝트가 많습니다. 그리고 domain 레이어를 분리해서 사용하는 경우가 많은데, 이러한 domain 레이어는 안드로이드에 의존성이 없도록 만드는 것이 원칙입니다.

그래서 JvmLibraryConventionPlugin을 만들게 되었습니다.

이번 포스팅의 결과물은 아래 Github Repository의 11-JvmLibraryConventionPlugin 브랜치를 확인하시면 됩니다.

 

GitHub - taein8935/multi-module-template-aos

Contribute to taein8935/multi-module-template-aos development by creating an account on GitHub.

github.com