que - notacion en java
Especificación del orden de los procesadores de anotación. (3)
Después de mucha investigación y de haber hablado con uno de los desarrolladores de Lombok, resulta que debido a que javac realiza la carga de clases en función de hashCode (), el orden de los procesadores de anotación que se ejecutan en este escenario es esencialmente aleatorio, y lo que es peor, aleatorio entre múltiples carreras. Actualmente no parece haber una solución a este problema.
Fui con el plugin lombok-maven y realicé todo el proceso, que no es perfecto y un tanto intrépido, pero al menos produce un resultado funcional. Con la esperanza de que pueda ayudar a los futuros googlers que vienen aquí, he enviado la versión de trabajo al repositorio.
Estoy intentando ejecutar Dagger 2 y Lombok en mi proyecto Java. Lombok tiene que correr primero, por supuesto, pero si realmente lo hace parece ser una casualidad. Al principio sospeché que podía especificar el orden por la posición respectiva de los archivos de la biblioteca en la ruta de clases, pero ese orden evidentemente se ignora.
¿Hay una manera de especificar el orden para que se ejecuten de alguna manera, o simplemente tengo que vivir sin poder combinar dos AP?
He producido un caso de prueba SSCCE .
Una simple mvn compile
git clone
& mvn compile
es suficiente para demostrar el problema: si comenta la línea 18 y las líneas de comentario 20-21 en App.java, se compilará, aunque la notación de Lombok en la línea 18 crea un constructor idéntico. El problema es que Lombok parece correr tras Dagger.
Es posible especificar el orden de los procesadores de anotación en javac utilizando el indicador -processor
. Sin embargo, no obtuve la compilación incluso con este conjunto de parámetros. Sospecho que Dagger mira el código fuente directamente, o que la API del procesador de anotaciones programa el procesador de anotaciones en la misma ronda y las modificaciones de lombok no se propagan.
Creo que la solución más robusta ahora es usar delombok para forzar el orden.
Divulgación: Soy un desarrollador de Lombok.
Idealmente, el orden no debería importar. Los procesadores de anotaciones solo deben crear archivos: cada vez que se crea un archivo, se inicia otra ronda de procesamiento y otro procesador tiene la oportunidad de hacer lo suyo con el nuevo archivo. En este caso, el orden realmente no importa, por lo que no creo que haya una forma oficial de forzar un orden de los procesadores. El problema es que el procesador Lombok manipula los archivos existentes en lugar de crear otros nuevos, lo que se supone que no debe hacer. Algunos compiladores pueden tener una opción para ordenar procesadores o usar el orden en que se cargan los procesadores o aparecer en los argumentos de la línea de comando, pero eso dependerá de la implementación del compilador.
Puedes intentar ver el proceso de construcción de Daggers and Lombok y ver qué procesadores se invocan allí. Luego, configure explícitamente los procesadores en su compilación Maven en el orden correcto y pruebe diferentes compiladores y vea si alguno de ellos los ejecuta en este orden.
Si es necesario, podría dividir el proceso de compilación y ejecutar Lombok con -proc:only
primero y luego otro paso de compilación sin Lombok y sin anular los archivos manipulados (si es posible, nunca lo intenté).