Benutzerdefinierte Lombok Annotation-Handler schreiben

Ich möchte benutzerdefinierte Lombok Annotation-Handler schreiben. Ich kennehttp: //notatube.blogspot.de/2010/12/project-lombok-creating-custom.htm. Die aktuelle lombok-JAR-Datei enthält jedoch nicht viele .class-Dateien, sondern Dateien mit dem Namen .SCL.lombok.

Ich habe festgestellt, dass die .SCL.lombok-Dateien die .class-Dateien sind, das Build-Skript von Lombok sie beim Generieren der JAR-Datei umbenennt und das ShadowClassLoader ist in der Lage, diese Klassen zu laden - und das Akronym SCL scheint hieraus zu stammen. Der Grund hierfür scheint nur zu sein: "Vermeiden Sie, den Namespace eines Projekts mit einer SCL-basierten JAR-Datei zu kontaminieren. Autocompleters in IDEs schlagen nur die tatsächliche öffentliche API vor."

Ich konnte meinen benutzerdefinierten Handler nur mit @ kompiliere

inhalt der lombok.jar auspacken Umbenennen der .SCL.lombok-Dateien in .class Hinzufügen des resultierenden Verzeichnisses zum Kompilierungsklassenpfad

Um meinen benutzerdefinierten Handler verwenden zu können, musste ich ein neues Fettgefäß erstellen, das sowohl die Lombok-Klassen als auch meinen benutzerdefinierten Handler enthält. Der benutzerdefinierte Lombok-Klassenladeprogramm verhindert im Wesentlichen das Hinzufügen von benutzerdefinierten Handlern in anderen mehreren Jars.

Ist dies der einzige Weg, um Lombok zu erweitern? Oder vermisse ich etwas?

Ich verwende das folgende Buildscript

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

Antworten auf die Frage(2)

Ihre Antwort auf die Frage