Je dois exécuter un processeur d'annotation sur les sources de mon projet. Le processeur d'annotation ne doit pas devenir une dépendance transitive du projet car il n'est nécessaire que pour le traitement des annotations et rien d'autre.
Voici le pom de test complet (non fonctionnel) que j'utilise pour cela:
<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>
J'ai explicitement défini org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor
comme processeur d'annotation dans la configuration du plugin pour les tests et je sais que cela ne devrait pas être nécessaire.
Le problème que je rencontre est que le hibernate-jpamodelgen
la dépendance n'est pas ajoutée au chemin de classe du compilateur, le processeur d'annotation est donc introuvable et la génération échoue.
Conformément à cela réponse , j'ai essayé d'ajouter la dépendance en tant qu'extension de build (je ne suis pas sûr de comprendre ce que celles-ci sont censées être!) Comme ceci:
<extensions>
<extension>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-jpamodelgen</artifactId>
<version>${hibernate-jpamodelgen.version}</version>
</extension>
</extensions>
Cela n'ajoute pas non plus hibernate-jpamodelgen
au chemin de classe du compilateur.
La seule chose que j'ai trouvée qui fonctionne jusqu'à présent est d'ajouter la dépendance au projet dans le <dependencies>
section. Cela a pour effet secondaire malheureux d'ajouter hibernate-jpamodelgen
comme une dépendance transitive par la suite que je veux éviter.
Ma configuration de travail précédente utilise le maven-processor-plugin
plugin pour réaliser ce que je veux. Cependant, ce plugin n'est pas pris en charge par Eclipse m2e et la dernière version de maven-compiler-plugin
gère désormais correctement plusieurs arguments du compilateur, je préfère donc utiliser ce dernier.
Ajoutez la dépendance en tant que dépendance facultative (<optional>true</optional>
). Cela ajoutera la dépendance en cours de compilation, mais l'empêchera d'être une dépendance transitive:
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-jpamodelgen</artifactId>
<version>${hibernate-jpamodelgen.version}</version>
<optional>true</optional>
</dependency>
Si vous créez un artefact dans ce module avec toutes vos dépendances (comme un .war), vous pouvez utiliser le <scope>provided</scope>
au lieu. Cela empêche à la fois la dépendance d'être transitive et d'être incluse dans l'artefact produit par le module.
L'option annotationProcessorPaths peut être utilisée dans les versions récentes du plug-in du compilateur 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 cette façon, le processeur est séparé des dépendances réelles du projet. Cette option est également récupérée par le plug-in Eclipse M2E si le traitement des annotations est activé pour le projet.
Le problème est vraiment dans . * version de maven-compiler-plugin
. Il agit un peu différemment de la version 2. *. En particulier, il semble que maven-compiler-plugin
. * n'ajoute pas ses dépendances et ne construit pas d'extensions au chemin de classe car il utilise des instruments javax.tools pour exécuter le processus de compilation. Pour récupérer l'ancien comportement de maven-compiler-plugin
vous devez utiliser une nouvelle propriété de configuration forceJavacCompilerUse
:
<plugin>
<groupId>org.Apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<forceJavacCompilerUse>true</forceJavacCompilerUse>
</configuration>
....
</plugin>
Pour d'autres visiteurs, j'ai trouvé qu'il y avait des changements importants dans la série 3.x de maven-compiler-plugin.
Voilà comment je fais ça. (Je suis celui que tu as lié)
Le fait est que ma solution ne fonctionne pas avec ces séries 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>
Pour JDK 10, j'ai vraiment dû devenir un peu fou pour le faire fonctionner, en espérant que quelqu'un trouve cela utile
<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>
Je ne sais pas quel type d'erreur de build vous avez obtenu, mais voici mon cas: j'ai eu l'erreur de compilation suivante dans Idea: Annotation processor 'org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor' not found error
Mais, une fois compilé à partir de Maven, tout allait bien.
Donc, mon problème était que, d'une manière ou d'une autre, j'ai eu une mauvaise configuration dans les paramètres Idea. En particulier, il est apparu que Idea a en quelque sorte détecté le processeur et l'a placé dans les paramètres des profils de processeur du module. Il est discuté ici.
Je l'ai corrigé comme suit:
Je pense que c'est une meilleure façon de contenir ces dépendances dans les profils pour résoudre de tels problèmes.
<profile>
<id>XXX-profile</id>
<dependencies>
<dependency>
// XXX artifact path
</dependency>
</dependencies>
</profile>