Gradle: Delombok 적용

2022-12-03

들어가며

또 오랜만의 기술 내용이다.

기술이 하도 빠르게 변하다 보니 오늘 적는 내용이 얼마나 오래 유효할지 알 수 없는 세상이라 그동안 작성을 많이 망설였다. 그러나 경력이 쌓여가며 내가 한 것들을 내가 기억하지 못하는 상황이 점점 생겼고 나중에 빠르게 찾아보기 위해서라도 기록해야겠다는 생각이 들었다.

필요성

이번에는 Delombok을 Gradle에 잘 적용하기 위한 내용이다. 사실 Lombok을 꽤 좋아해서 있는 그대로 잘 쓰고 있었는데, Delombok을 해야겠다는 생각이 든 이유는 다음과 같다.

마지막이 FreeFair Gradle Lombok Plugin과 가장 다른 점이다.#

In contrast to the javadoc task, the sourcesJar task is not adjusted to use the delomboked sources. This is done on purpose, so the line numbers in the -sources.jar match the LineNumberTable in the generated class files.

다만 javadoc variant를 사용하고 있지는 않아서 일반과 sources variant만 고려했다.

방법

기본 sources variant를 만들기 위해서는 다음과 같이 사용했었다.

plugins {
    id 'java'
}

java {
    withSourcesJar()
}

구현부를 보자.

gradle/gradle@v7.5.1/subprojects/plugins/src/main/java/org/gradle/api/plugins/internal/DefaultJavaPluginExtension.java#L218-L223

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());
}

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

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

plugins {
    id 'java'

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

java {
    // @see org.gradle.api.plugins.internal.DefaultJavaPluginExtension#withSourcesJar
    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,
            project.fileResolver)
}

compileJava {
    source = sourceSets.main.delombokTask
}

참고로 project.fileResolverProjectInternal의 메소드인데 build.gradle에서의 타입과 달라 Syntax Highlighting이 제대로 되지 않고 인수 타입도 추론할 수 없다고 나오고, compileJava block에서 source sourceSets.main.delombokTask로(= 없이) 사용하면 duplicate class 오류가 발생한다.

나오며

사실 이렇게 delombok된 코드를 보면 Stream chain에 줄 나눠놓은 것들이 다 합쳐져 있든지 해서 조금 맘에 들지 않는 부분들이 있다. 아예 다 delombok하지 않은 상태로 쓸까 생각도 든다.

2023-02-15 추가

후속 글#을 작성했다.

돌아가기


댓글