또 오랜만의 기술 내용이다.
기술이 하도 빠르게 변하다 보니 오늘 적는 내용이 얼마나 오래 유효할지 알 수 없는 세상이라 그동안 작성을 많이 망설였다. 그러나 경력이 쌓여가며 내가 한 것들을 내가 기억하지 못하는 상황이 점점 생겼고 나중에 빠르게 찾아보기 위해서라도 기록해야겠다는 생각이 들었다.
이번에는 Delombok을 Gradle에 잘 적용하기 위한 내용이다. 사실 Lombok을 꽤 좋아해서 있는 그대로 잘 쓰고 있었는데, Delombok을 해야겠다는 생각이 든 이유는 다음과 같다.
마지막이 FreeFair Gradle Lombok Plugin과 가장 다른 점이다.#
In contrast to the
javadoc
task, thesourcesJar
task is not adjusted to use the delomboked sources. This is done on purpose, so the line numbers in the-sources.jar
match theLineNumberTable
in the generated class files.
다만 javadoc variant를 사용하고 있지는 않아서 일반과 sources variant만 고려했다.
기본 sources variant를 만들기 위해서는 다음과 같이 사용했었다.
plugins {
id 'java'
}
java {
withSourcesJar()
}
구현부를 보자.
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());
}
고려한 내용들은 다음과 같다.
def
로 선언import static
제거main.allSource
→ main.delombokTask
private
필드인 objectFactory
에 접근할 수 없어 생성자에서 project.getObjects()
로 설정해주는 것# 보고 해당 내용으로 대체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.fileResolver
는 ProjectInternal
의 메소드인데 build.gradle에서의 타입과 달라 Syntax Highlighting이 제대로 되지 않고 인수 타입도 추론할 수 없다고 나오고, compileJava
block에서 source sourceSets.main.delombokTask
로(=
없이) 사용하면 duplicate class 오류가 발생한다.
사실 이렇게 delombok된 코드를 보면 Stream chain에 줄 나눠놓은 것들이 다 합쳐져 있든지 해서 조금 맘에 들지 않는 부분들이 있다. 아예 다 delombok하지 않은 상태로 쓸까 생각도 든다.
후속 글#을 작성했다.