2011-11-18 27 views
21

Estoy probando Java 7 para un proyecto y conseguir las advertencias de los procesadores de anotación (Bindgen e Hibernate JPA modelgen) de este tipo:procesador de anotación Java 6 Adelante compatible y SupportedSourceVersion

warning: Supported source version 'RELEASE_6' from annotation processor 'org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor' less than -source '1.7' 

Esto es causado por el @SupportedSourceVersion(SourceVersion.RELEASE_6) anotación en las clases del procesador de anotación. Como están compilados con Java 6, el valor más alto de SourceVersion disponible para ellos es RELEASE_6. La versión de Java 7 de SourceVersion introduce RELEASE_7.

Mis preguntas: ¿Cómo se supone que los procesadores de anotaciones manejan la compatibilidad hacia adelante? ¿Tendrán que existir versiones binarias jdk6 y jdk7 separadas de ellos? ¿No estoy entendiendo algo más aquí?

Sólo he encontrado la siguiente información con respecto a esta preocupación:

Querdydsl bug report que se usa

@Override 
public SourceVersion getSupportedSourceVersion() { 
    return SourceVersion.latest(); 
} 

Oracle blog en el que un commentor recomienda apoyar última versión de código

Respuesta

12

Compatibilidad hacia adelante se maneja mediante el procesamiento de lenguaje desconocido construye apropiadamente, por ejemplo implementando ElementVisitor.visitUnknown.

Hay otra entrada en el mencionado Oracle blog, lo que sugiere dos políticas respecto a la compatibilidad hacia adelante:

  • Escribir el procesador para trabajar solamente con la versión de idioma actual.
  • Escriba el procesador para hacer frente a construcciones futuras desconocidas.

La segunda se realiza mediante la devolución de SourceVersion.latest() como ya se ha publicado en la pregunta.

Creo que está bien hacerlo en la mayoría de los casos, cuando está seguro de que los elementos de idioma adicionales no romperán nada. Por supuesto, no debe suponer que todo estará bien, incluso con las versiones más nuevas, debe probarlo también.


Ok, supongo procesamiento del lenguaje desconocido construye adecuadamente parece un poco extraño, así que aquí están algunos ejemplos.

Supone que tiene un procesador que busca un tipo personalizado de anotaciones en construcciones de lenguaje conocidas (anotaciones en una clase, por ejemplo) y crea una documentación simple de lo que ha encontrado. Probablemente sea seguro suponer que también funcionará en versiones más nuevas. Restringirlo a una versión particular no sería una buena decisión en mi opinión.

Supongamos que tiene un procesador que verifica todos los elementos que puede encontrar y analiza la estructura del código para generar un gráfico. Puede tener problemas con las versiones más nuevas. Es posible que pueda manejar construcciones de lenguaje desconocido de alguna manera (como al agregar un nodo desconocido al gráfico) pero solo haga esto si tiene sentido, y si vale la pena.Si el procesador simplemente ya no sería útil cuando se enfrenta con algo desconocido, probablemente debería apegarse a una versión java en particular.

Independientemente de la política utilizada, la mejor manera en mi opinión sería supervisar los próximos cambios en el idioma y actualizar el procesador en consecuencia. En Java 7, por ejemplo, project coin introdujo algunas características nuevas del lenguaje, que probablemente ni siquiera sean visibles para un procesador. Java 8 por otro lado tiene nuevas construcciones que afectarán el procesamiento, por ejemplo type annotations. Sin embargo, las nuevas características del lenguaje no ocurren tan a menudo, por lo que es probable que ni siquiera necesite cambiar nada durante mucho tiempo.

+1

Gracias por su publicación inicial y la actualización. Todavía no acepté tu respuesta porque todavía estoy (muy a tiempo parcial) en el proceso de convertir un procesador de anotación en Java 7. Quiero ver si aparece algo más. – bernie

Cuestiones relacionadas