web-dev-qa-db-fra.com

Maven 3 - Comment ajouter une dépendance de processeur d'annotation?

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.

23
bernie

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.

21

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.

15
Gunnar

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>
8
Vadim

Veuillez jeter un oeil jpa-metamodels-with-maven

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>
4
Jin Kwon

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>
3
Marc Magon

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:

  1. Accédez à Idée> Paramètres> Processeurs d'annotation.
  2. Pour chaque profil de processeur, assurez-vous que:
    • Activer le traitement des annotations est Oui;
    • Il n'y a pas de nom FQ de processeur d'annotation dont vous avez une erreur (par exemple "JPAMetaModelEntityProcessor") dans la liste sur le côté droit. S'il y figure, sélectionnez-le et cliquez sur le bouton moins - pour le supprimer.
2
Andrew Redko

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>
0
Nikita Koval