web-dev-qa-db-fra.com

Processeur d'annotation dans IntelliJ et Gradle

tl; dr : Je ne peux pas configurer IntelliJ pour générer les fichiers Java dans le même répertoire que gradle

J'ai un petit projet qui utilise le processeur d'annotation immutables . Cela fonctionne comme prévu dans la construction de la ligne de commande gradle, mais je ne peux pas obtenir IntelliJ pour sortir les fichiers générés dans le même répertoire.

Le projet complet est disponible sur GitLab

Configuration Gradle :
J'utilise les plugins gradle suivants:

  • plugin gradle-idea qui gère la configuration de l'idée
  • gradle-apt-plugin qui fournit la configuration apt et gère le chemin de la classe de compilation et la configuration d'idées liées au traitement des annotations (si le plugin d'idées est également appliqué)

parties pertinentes du script de construction ( lien vers la liste complète ):

apply plugin: 'Java'
apply plugin: "net.ltgt.apt"
apply plugin: 'idea'

dependencies {
    def immutablesVersion = '2.3.9'
    compileOnly "org.immutables:value:$immutablesVersion:annotations"
    compileOnly "org.immutables:encode:$immutablesVersion"
    apt "org.immutables:value:$immutablesVersion"
}

quand je commence ./gradlew build tout est comme prévu: enter image description here

  1. Le fichier source DataEncoding.Java est traité dans le fichier Java généré DataEncodingEnabled.Java finit dans
  2. /build/generated/source/apt/main sous le package attendu com.tmtron.immutables.data
  3. et le fichier généré est également compilé dans un fichier .class

Dans IntelliJ, j'active le traitement des annotations comme suggéré par les gradle-apt-plugin docs : enter image description here

Ensuite, j'exécute ./gradlew clean pour m'assurer que les fichiers précédents ont disparu, puis je clique sur Build - Build Project dans IntelliJ.
Le processeur d'annotation est exécuté, mais le problème est que le fichier généré Java se retrouve au mauvais endroit: enter image description here

Il se trouve dans: /build/generated/source/apt/main/build/generated/source/apt/main/com.tmtron.immutables.data
la partie en gras est redondante.

Qu'est-ce que je fais mal et comment puis-je le configurer correctement, afin qu'IntelliJ et gradle génèrent les fichiers dans le même répertoire?

Remarques:

  • J'ai bien sûr déjà essayé de laisser le "répertoire des sources de production" dans la configuration d'annotation IntelliJ vide, mais le sien ne fonctionne pas: alors il utilise automatiquement "généré" et je me retrouve également avec un mauvais chemin.
  • Version IntelliJ 2016.3.4
17
TmTron

MISE À JOUR 2.2019
depuis Gradle 5.2, il existe un moyen facile de le faire - voir gavenkoa s answer

MISE À JOUR 5.2018

Le moyen le plus simple que je connaisse est d'utiliser le plugin apt-idea

Activez simplement le plugin dans le build.gradle fichier:

plugins {
    id 'Java'
    id 'net.ltgt.apt-idea' version "0.15"
}

puis ajoutez les processeurs d'annotation à la configuration annotationProcessor:

final DAGGER_VER = '2.16'
dependencies {
    implementation "com.google.dagger:dagger:${DAGGER_VER}"
    annotationProcessor"com.google.dagger:dagger-compiler:${DAGGER_VER}"
}

Projet de test sur GitHub: ex.dagger
(en utilisant IntelliJ 2018.1.4, Gradle 4.7)

RÉPONSE ORIG

Il existe une solution de contournement simple en utilisant le répertoire parent qui fonctionne correctement dans IntelliJ 2016.3.4

  • Répertoire des sources de production: ../main
  • Répertoire des sources de test: ../test

Gradle et IntelliJ vont maintenant générer le code dans les mêmes répertoires.

Corrigé dans projet GitLab V0.0.2

voir aussi: problème # 35 d'apt-gradle-plugin

13
TmTron

Maintenant https://github.com/tbroyer/gradle-apt-plugin déclare:

Le but de ce plugin était finalement de ne plus être nécessaire, étant remplacé par des fonctionnalités intégrées. Cela devient une réalité avec Gradle 5.2 et IntelliJ IDEA 2019.1 .

Donc:

dependencies {
  compile("com.google.dagger:dagger:2.18")
  annotationProcessor("com.google.dagger:dagger-compiler:2.18")

  compileOnly("com.google.auto.factory:auto-factory:1.0-beta6")
  annotationProcessor("com.google.auto.factory:auto-factory:1.0-beta6")

  compileOnly("org.immutables:value-annotations:2.7.1")
  annotationProcessor("org.immutables:value:2.7.1")
}

compileOnly est nécessaire si vous utilisez des annotations, compile si vous utilisez des classes, annotationProcessor introduit dans Gradle 4.6 .

Pour activer le traitement d'une tâche de compilation spécifique:

compileJava {
    options.annotationProcessorPath = configurations.annotationProcessor
}

Pour désactiver:

  compileTestJava {
      options.compilerArgs += '-proc:none'
  }
8
gavenkoa

Hé là, tout le monde, j'ai eu le même problème et j'ai trouvé un moyen propre de résoudre ce problème. J'utilise deux bibliothèques qui nécessitent un traitement d'annotation (Lombok et MapStruct).

Aussi mon IntelliJ est 2019.1 (mettez à jour le vôtre s'il est plus ancien) et Gradle 5.2.1.

Configurons d'abord IntelliJ:

  1. Désactivez le traitement des annotations dans les paramètres, car nous allons tout déléguer à Gradle:

enter image description here

  1. Déléguer IDE à Gradle:

enter image description here

La dernière étape consiste à configurer correctement vos dépendances dans Gradle.

  1. Section des dépendances dans Gradle:

enter image description here

Vous pouvez maintenant exécuter la construction et l'exécution à partir de la ligne de commande et de l'EDI.

À votre santé!

7
de.la.ru

2019.2.x

  • Désactiver le processeur d'annotation d'Intellij

disableAnnotationProcessor

  • ajouter, créer un répertoire dans votre fichier gradle build.gradle

build.gradle

  • puis exécutez votre tâche gradle pour générer des classes de fichiers de génération, exemple gradle compileJava

runGradleTask

  • Fichier -> structure du projet -> Modules -> Dossier principal || supprimer exclure et ajouter comme source

projectStructure

Et le projet devrait trouver toutes les annotations et le fichier source généré. J'espère que cela aide.

0
Shakil