type notacion crear anotación anotaciones annotation java maven jpa-2.0 maven-3 annotation-processing

notacion - java lang annotation



Maven 3-¿Cómo agregar la dependencia del procesador de anotaciones? (7)

Necesito ejecutar un procesador de anotaciones en las fuentes de mi proyecto. El procesador de anotaciones no debe convertirse en una dependencia transitiva del proyecto, ya que solo es necesario para el procesamiento de anotaciones y nada más.

Aquí está el pom de prueba completo (que no funciona) que uso para esto:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>test</groupId> <artifactId>test</artifactId> <packaging>jar</packaging> <version>1.0-SNAPSHOT</version> <name>Test annotations</name> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <hibernate-jpamodelgen.version>1.2.0.Final</hibernate-jpamodelgen.version> </properties> <dependencies> <dependency> <groupId>javax</groupId> <artifactId>javaee-api</artifactId> <version>6.0</version> <scope>provided</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.0</version> <configuration> <annotationProcessors> <annotationProcessor> org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor</annotationProcessor> </annotationProcessors> <debug>true</debug> <optimize>true</optimize> <source>1.6</source> <target>1.6</target> <compilerArguments> <AaddGeneratedAnnotation>true</AaddGeneratedAnnotation> <Adebug>true</Adebug> </compilerArguments> </configuration> <dependencies> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-jpamodelgen</artifactId> <version>${hibernate-jpamodelgen.version}</version> </dependency> </dependencies> </plugin> </plugins> </build> </project>

org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor explícitamente org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor como un procesador de anotación en la configuración del complemento para pruebas y sé que no debería ser necesario.

El problema que me encuentro es que la dependencia hibernate-jpamodelgen no se agrega a la ruta de hibernate-jpamodelgen del compilador, por lo que no se encuentra el procesador de anotaciones y la compilación falla.

Según esta answer , intenté agregar la dependencia como una extensión de compilación (¡no estoy seguro de entender lo que se supone que deben ser!) Así:

<extensions> <extension> <groupId>org.hibernate</groupId> <artifactId>hibernate-jpamodelgen</artifactId> <version>${hibernate-jpamodelgen.version}</version> </extension> </extensions>

Esto tampoco agrega hibernate-jpamodelgen al classpath del compilador.

Lo único que encontré que funciona hasta ahora es agregar la dependencia al proyecto en la sección <dependencies> . Esto tiene el desafortunado efecto secundario de agregar hibernate-jpamodelgen como una dependencia transitiva que luego quiero evitar.

Mi configuración de trabajo anterior utiliza el maven-processor-plugin para lograr lo que quiero. Sin embargo, este complemento no es compatible con eclipse m2e y la última versión del maven-compiler-plugin ahora maneja múltiples argumentos del compilador correctamente, así que prefiero usar este último.


Por favor, eche un vistazo a jpa-metamodels-with-maven

Para otros visitantes, encontré que hay algunos cambios significativos en la serie 3.x de maven-compiler-plugin.

Así es como hago esto. (Soy a quien vinculaste)

El punto es que mi solución no funciona con esas series 3.x de maven-compiler-plugin.

<project ...> <build> <extensions> <extension> <groupId>org.hibernate</groupId> <artifactId>hibernate-jpamodelgen</artifactId> <version>1.3.0.Final</version> </extension> </extensions> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>2.5.1</version> <!-- See this? --> </plugin> </plugins> </build> </project>


Agregue la dependencia como una dependencia opcional ( <optional>true</optional> ). Esto agregará la dependencia en la compilación, pero evitará que sea una dependencia transitiva:

<dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-jpamodelgen</artifactId> <version>${hibernate-jpamodelgen.version}</version> <optional>true</optional> </dependency>

Si está creando un artefacto en este módulo con todas sus dependencias (como un .war), puede usar el <scope>provided</scope> lugar. Esto evita que la dependencia sea transitiva y se incluya en el artefacto que produce el módulo.


Creo que esta es una mejor manera de contener tales dependencias en los perfiles para resolver tales problemas.

<profile> <id>XXX-profile</id> <dependencies> <dependency> // XXX artifact path </dependency> </dependencies> </profile>


El problema está realmente en la versión 3. * del maven-compiler-plugin . Actúa un poco diferente de la versión 2. * . En particular, parece que maven-compiler-plugin 3. * no agrega sus dependencias y construye extensiones en el classpath porque usa los instrumentos javax.tools para ejecutar el proceso de compilación. Para recuperar el comportamiento anterior de maven-compiler-plugin , debe usar una nueva propiedad de configuración forceJavacCompilerUse :

<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.1</version> <configuration> <forceJavacCompilerUse>true</forceJavacCompilerUse> </configuration> .... </plugin>


La opción annotationProcessorPaths se puede usar en versiones recientes del complemento del compilador de Maven:

<pluginManagement> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.6.1</version> <configuration> <annotationProcessorPaths> <annotationProcessorPath> <groupId>org.hibernate</groupId> <artifactId>hibernate-jpamodelgen</artifactId> <version>5.2.6.Final</version> </annotationProcessorPath> </annotationProcessorPaths> </configuration> </plugin> </plugins> </pluginManagement>

De esa manera, el procesador se separa de las dependencias reales del proyecto. El complemento Eclipse M2E también selecciona esta opción si el proceso de anotación está habilitado para el proyecto.


No estoy seguro de qué tipo de error de compilación recibió, pero aquí está mi caso: Recibí el siguiente error de compilación en Idea: Annotation processor ''org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor'' not found error

Pero, cuando se compiló de Maven, todo estaba bien.

Por lo tanto, el problema mío era que de alguna manera obtuve una configuración incorrecta en la configuración de Idea. En particular, parece que Idea detectó de alguna manera el procesador y lo introdujo en la configuración de los perfiles del procesador del módulo. Se discute aquí.

Lo arreglé como lo siguiente:

  1. Vaya a Idea> Configuraciones> Procesadores de anotación.
  2. Para cada perfil de procesador, asegúrese de que:
    • Habilitar el proceso de anotación es Sí;
    • No hay un nombre de FQ del procesador de anotaciones de uno sobre el que tiene un error (ei "JPAMetaModelEntityProcessor") en la lista del lado derecho. Si aparece en la lista, simplemente seleccione y haga clic en el botón menos - - ''para eliminarlo.

Para JDK 10, realmente tuve que volverme un poco loco para que funcionara. Esperando que alguien lo encuentre útil.

<jaxb.version>2.3.0</jaxb.version> <maven.hibernate.version>5.3.2.Final</maven.hibernate.version> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>${maven.compiler.version}</version> <goals> <goal>compile</goal> </goals> <configuration> <outputDirectory>${project.build.directory}/generated-sources/annotations</outputDirectory> <annotationProcessorPaths> <annotationProcessorPath> <groupId>org.hibernate</groupId> <artifactId>hibernate-jpamodelgen</artifactId> <version>${maven.hibernate.version}</version> </annotationProcessorPath> <annotationProcessorPath> <groupId>javax.xml.bind</groupId> <artifactId>jaxb-api</artifactId> <version>${jaxb.version}</version> </annotationProcessorPath> </annotationProcessorPaths> <annotationProcessors> <annotationProcessor>org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor</annotationProcessor> </annotationProcessors> <compilerArgs> <arg>-AaddGeneratedAnnotation=false</arg> </compilerArgs> <compilerArguments> <AaddGeneratedAnnotation>false</AaddGeneratedAnnotation> <Adebug>true</Adebug> </compilerArguments> <failOnError>true</failOnError> </configuration> <dependencies> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-jpamodelgen</artifactId> <version>${maven.hibernate.version}</version> <optional>true</optional> </dependency> <dependency> <groupId>javax.xml.bind</groupId> <artifactId>jaxb-api</artifactId> <version>2.3.0</version> <type>jar</type> </dependency> </dependencies> </plugin>