redimensionar - seticon java
Escribiendo manejadores de anotaciones Lombok personalizados (2)
Encontré este blog que explica cuál es la forma correcta de crear tu propio controlador. Específicamente, se dice que los controladores se descubren a través de un marco denominado SPI .
Quiero escribir controladores de anotaciones de Lombok personalizados. Sé que http://notatube.blogspot.de/2010/12/project-lombok-creating-custom.html . Pero el archivo jar actual de lombok no contiene muchos archivos .class, sino archivos con el nombre .SCL.lombok.
Descubrí que los archivos .SCL.lombok son los archivos .class, el script de compilación de Lombok los renombra mientras genera el archivo jar, y ShadowClassLoader es capaz de cargar estas clases, y el acrónimo SCL parece provenir de esto. Parece que la razón de esto es simplemente "Evite contaminar el espacio de nombres de cualquier proyecto utilizando un jar basado en SCL. Los autocompletadores en IDE NO sugerirán nada más que la API pública real".
Solo pude compilar mi controlador personalizado por
- desempaquetando los contenidos de lombok.jar
- renombrando los archivos .SCL.lombok a .class
- agregando el directorio resultante a la ruta de clase de compilación
Además, para poder usar mi controlador personalizado, necesitaba crear un nuevo frasco que contenía tanto las clases lombok como mi controlador personalizado. El cargador de clases lombok personalizado esencialmente evita que se agreguen controladores personalizados en otros tarros múltiples.
¿Es esta la única manera de extender Lombok? ¿O me estoy perdiendo algo?
Estoy usando el siguiente 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)
}
Mientras tanto, Reinier Zwitserloot creó un nuevo git-branch sclExpansionUpdate , que contiene una versión actualizada de ShadowClassLoader :
ShadowClassLoader ahora es más amigable al tratar de extender lombok.
Su jar / dir (separado) debe tener un archivo llamado META-INF / ShadowClassLoader. Este archivo debe contener la cadena ''lombok''. Si tienes eso, cualquier clase en ese jar / dir se cargará en el mismo espacio que las clases lombok. También puede cambiar el nombre de los archivos de clase a .SCL.lombok para evitar que otros cargadores los encuentren.
Supongo que esto aún no llegó a la rama principal porque ciertamente no se ha probado tanto, simplemente lo probé por mí mismo y contiene un pequeño error que impide cargar los servicios / servicios META-INF necesarios desde las extensiones. Para solucionarlo, debe reemplazar dos llamadas de método a partOfShadow
con 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
}
}
Lo probé con la solución anterior y parece funcionar bien (aunque no se ha probado mucho).
En una nota al margen: con este nuevo mecanismo de extensión, ahora también es posible tener los controladores de anotaciones de extensiones y las anotaciones en un espacio de nombres diferente al de "lombok". ¡Muy bien!