Gradle 8.0: Delombok, google-java-format 적용

2023-02-15

들어가며

이전 글#의 후속 내용이다.

google-java-format 적용

제목에서는 더 뒤에 나오지만, 실제 구현했던 순서가 더 빨라 먼저 설명한다.

delombok된 코드를 보면 Stream chain에 줄 나눠놓은 것들이 다 합쳐져 있든지 해서 읽기 어려운 경우가 있기에 일괄적으로 formatting을 해주고자 하였다. 역시 bytecode, sources variant에도 (delombok 후) googleJavaFormat 전체 적용이 필요하다.

Delombok때 사용했던 것과 동일한 부분은 최대한 생략하고, 추가해야 하는 곳을 살펴보면 다음과 같다. 오직 delombokTask의 뒤에 무조건 실행되도록 붙여서 모든 것을 얻어간다.

// import 생략

plugins {
    id 'java'

    id 'io.freefair.lombok' version '6.6'
    id 'com.github.sherter.google-java-format' version '0.9'
}

java {
    // 생략
}

compileJava {
    // 생략
}

delombok.finalizedBy tasks.named('googleJavaFormat')

googleJavaFormat {
    source = sourceSets.main.delombokTask
    options style: 'AOSP'
}

두 가지 주의해야 한다.

Gradle 8.0

1년 10개월 만의 Major 버전업이고, 내 기여#1 #2가 들어간 버전이다.

sources variant의 구현부를 다시 한번 보자. Signature가 변경되었을 거라고 생각을 못 해서 꽤 헤맸다.

gradle/gradle@v8.0.0/subprojects/plugins/src/main/java/org/gradle/api/plugins/internal/DefaultJavaPluginExtension.java#L219-L224

public void withSourcesJar() {
    TaskContainer tasks = project.getTasks();
    ConfigurationContainer configurations = project.getConfigurations();
    SourceSet main = getSourceSets().getByName(SourceSet.MAIN_SOURCE_SET_NAME);
    configureDocumentationVariantWithArtifact(SOURCES_ELEMENTS_CONFIGURATION_NAME, null, SOURCES, ImmutableList.of(), main.getSourcesJarTaskName(), main.getAllSource(), findJavaComponent(components), configurations, tasks, objectFactory, project.getFileResolver(), project.getTaskDependencyFactory());
}

고려한 내용들은 다음과 같다.

import org.gradle.api.internal.project.ProjectInternal
import org.gradle.api.plugins.internal.JvmPluginsHelper

plugins {
    id 'java'

    id 'io.freefair.lombok' version '6.6.2'
}

/**
 * @see org.gradle.api.plugins.internal.DefaultJavaPluginExtension#withSourcesJar
 */
java {
    def tasks = project.tasks
    def configurations = project.configurations
    def main = sourceSets.main
    JvmPluginsHelper.configureDocumentationVariantWithArtifact(
            JavaPlugin.SOURCES_ELEMENTS_CONFIGURATION_NAME,
            null,
            DocsType.SOURCES,
            [],
            main.sourcesJarTaskName,
            main.delombokTask,
            JvmPluginsHelper.findJavaComponent(components),
            configurations,
            tasks,
            project.objects,
            ((ProjectInternal) project).fileResolver,
            ((ProjectInternal) project).taskDependencyFactory)
}

compileJava {
    // 생략
}

추가로 Java toolchains를 사용하고 있었다면 settings.gradle에 다음과 같은 내용을 첫 부분에 추가해야 한다.

plugins {
    id 'org.gradle.toolchains.foojay-resolver-convention' version '0.4.0'
}

나오며

적용 다 해두고 글 작성하면서 palantir-java-format을 추가로 발견했다. google-java-format의 장풍을 해결해 주기에 적용하고 싶은데, Gradle Plugin이 spotless와의 통합만 염두에 두고 있는 것으로 보여 규모가 커질 것 같다.

한편 최근 인도네시아 등 여행을 계획하며 Lombok이 Jakarta 섬 주변에 있는 다른 섬 이름임을 이제야 알았다. 관광 요소가 무엇이 있을지는 잘 모르겠지만 한 번 들러는 보고 싶다.

2023-06-05 추가

후속 글#을 작성했다.

돌아가기