Я хочу написать собственные обработчики аннотаций Lombok. Я знаю http://notatube.blogspot.de/2010/12/project-lombok-creating-custom.html. Но текущий jar-файл ломбока содержит не много файлов .class, а файлы с именами .SCL.lombok.
Я обнаружил, что файлы .SCL.lombok являются файлами .class, скрипт сборки Lombok переименовывает их при создании файла jar, а ShadowClassLoader способен загружать эти классы - и, похоже, отсюда и аббревиатура SCL. Кажется, причина этого заключается только в том, чтобы «избегать загрязнения пространства имен любого проекта с использованием jar-файла на основе SCL. Автозаполнение в IDE НЕ будет предлагать ничего, кроме фактического общедоступного API».
Я смог скомпилировать свой собственный обработчик только с помощью
- распаковка содержимого lombok.jar
- переименование файлов .SCL.lombok в .class
- добавление полученного каталога в путь к классам компиляции
Кроме того, чтобы иметь возможность использовать свой собственный обработчик, мне нужно было создать новую толстую банку, содержащую как классы ломбока, так и мой собственный обработчик. Пользовательский загрузчик классов lombok по существу предотвращает добавление пользовательских обработчиков в другие несколько банок.
Это единственный способ расширить Ломбок? Или я что-то упускаю?
Я использую следующий скрипт сборки
apply plugin: 'java'
repositories {
jcenter()
}
configurations {
lombok
compileOnly
}
def unpackedAndRenamedLombokDir = file("$buildDir/lombok")
task unpackAndRenameLombok {
inputs.files configurations.lombok
outputs.dir unpackedAndRenamedLombokDir
doFirst {
mkdir unpackedAndRenamedLombokDir
delete unpackedAndRenamedLombokDir.listFiles()
}
doLast {
copy {
from zipTree(configurations.lombok.singleFile)
into unpackedAndRenamedLombokDir
rename "(.*)[.]SCL[.]lombok", '$1.class'
}
}
}
sourceSets {
main {
compileClasspath += configurations.compileOnly
output.dir(unpackedAndRenamedLombokDir, builtBy: unpackAndRenameLombok)
}
}
tasks.compileJava {
dependsOn unpackAndRenameLombok
}
dependencies {
compile files("${System.properties['java.home']}/../lib/tools.jar")
compile "org.eclipse.jdt:org.eclipse.jdt.core:3.10.0"
compile 'javax.inject:javax.inject:1'
lombok 'org.projectlombok:lombok:1.16.6'
compileOnly files(unpackedAndRenamedLombokDir)
}