编写自定义的Lombok注释处理程序

我想编写自定义的Lombok注释处理程序。我知道http://notatube.blogspot.de/2010/12/project-lombok-

creating-custom.html。但是当前的lombok jar文件并不包含许多.class文件,而是包含名为.SCL.lombok的文件。

我发现.SCL.lombok文件是.class文件,Lombok的生成脚本在生成jar文件时会重命名它们,ShadowClassLoader能够加载这些类-

缩写SCL似乎来自于此。似乎这样做的原因仅仅是“避免使用基于SCL的jar污染任何项目的名称空间。IDE中的自动完成程序不会建议除实际的公共API外的任何其他内容。”

我只能通过以下方式编译我的自定义处理程序

  • 解压缩lombok.jar的内容
  • 将.SCL.lombok文件重命名为.class
  • 将结果目录添加到编译类路径

另外,为了能够使用我的自定义处理程序,我需要创建一个新的胖罐,其中包含lombok类和我的自定义处理程序。自定义的lombok类加载器实质上防止在其他多个jar中添加自定义的处理程序。

这是扩展龙目岛的唯一方法吗?还是我错过了什么?

我正在使用以下构建脚本

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)

}

回答:

与此同时Reinier

Zwitserloot创建了一个新的Git分支sclExpansionUpdate,包含的更新版本ShadowClassLoader:

ShadowClassLoader现在比尝试扩展lombok更友好。

您的(单独的)jar / dir应该有一个名为META-INF / ShadowClassLoader的文件。该文件应包含字符串“

lombok”。如果有的话,该jar /

dir中的任何类都将与lombok类加载在同一空间中。您也可以将类文件重命名为.SCL.lombok,以避免其他加载程序找到它们。

我猜这还没有进入主分支,因为它肯定还没有经过太多的测试-我只是为自己尝试了一下,它包含一个小错误,阻止从扩展加载所需的META-INF /

services。为了解决这个问题,你应该替代两个方法调用partOfShadowinOwnBase

[... line 443]

Enumeration<URL> sec = super.getResources(name);

while (sec.hasMoreElements()) {

URL item = sec.nextElement();

if (!inOwnBase(item, name)) vector.add(item); // <<-- HERE

}

if (altName != null) {

Enumeration<URL> tern = super.getResources(altName);

while (tern.hasMoreElements()) {

URL item = tern.nextElement();

if (!inOwnBase(item, altName)) vector.add(item); // <<-- AND HERE

}

}

我使用上面的修复程序对其进行了测试,但它似乎可以正常工作(尽管测试不多)。

附带说明:通过这种新的扩展机制,现在终于可以在与“ lombok”不同的命名空间中使用扩展注释处理程序和注释了-太好了!

以上是 编写自定义的Lombok注释处理程序 的全部内容, 来源链接: utcz.com/qa/425208.html

回到顶部