我想编写自定义Lombok Annotation处理程序。我知道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类和我的自定义处理程序的新fat jar。自定义lombok类加载器实质上阻止在其他多个jar中添加自定义处理程序。
这是扩展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)
}
答案 0 :(得分:7)
与此同时,Reinier Zwitserloot创建了一个新的git-branch sclExpansionUpdate,其中包含ShadowClassLoader的更新版本:
ShadowClassLoader现在更友好地尝试扩展lombok。
你的(单独的)jar / dir应该有一个名为的文件 META-INF / ShadowClassLoader。该文件应包含字符串 ' Lombok的&#39 ;.如果你有,那个jar / dir中的任何类都将被加载 与lombok类相同的空间。您也可以重命名该课程 文件到.SCL.lombok以避免其他加载器找到它们。
我想这还没有进入主分支,因为它当然没有经过多少测试 - 我只是为自己尝试了它,它包含一个小错误,阻止从扩展中加载所需的META-INF /服务。要解决此问题,您应该将partOfShadow
的两个方法调用替换为inOwnBase
:
[... 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
}
}
我用上面的修复程序对它进行了测试,它似乎工作正常(虽然测试不多)。
旁注:使用这种新的扩展机制,现在终于也可以将扩展注释处理程序和注释放在与&#34; lombok&#34;不同的名称空间中。 - 太好了!
答案 1 :(得分:1)
使用这个问题和其他答案(由Balder提供)的输入,我们设法将一个自定义的Lombok注释处理程序组合在一起:Symbok。随意将其用作编写自己的示例。
顺便说一句,您也可以实现javac plugin instead而不是编写自定义的Lombok处理程序,这可能会更简单。