Подтвердить что ты не робот

Как настроить IntelliJ/gradle для использования dagger 2.0

У меня есть проект gradle, и я хочу использовать в нем кинжал 2.0. Я не знаю, как настроить IntelliJ и gradle для генерации файлов и позволить IntelliJ найти их?

Мой файл build.gradle выглядит так:

apply plugin: 'java'
apply plugin: 'idea'

version = '1.0'

repositories {
    mavenCentral()
    maven {
        url "https://oss.sonatype.org/content/repositories/snapshots"
    }
}

dependencies {
    compile 'org.slf4j:slf4j-api:1.7.12'
    compile 'org.slf4j:slf4j-simple:1.7.12'
    compile 'commons-configuration:commons-configuration:1.10'
    compile 'commons-collections:commons-collections:3.2.1'
    compile 'com.google.dagger:dagger:2.0'
    compile 'com.google.dagger:dagger-compiler:2.0:jar-with-dependencies'
    compile 'com.pi4j:pi4j-distribution:1.1-SNAPSHOT'
}

В каталоге сборки моего приложения существует файл DaggerXmlConfigurationComponent, который создает компонент Dagger. Но я не могу использовать его в IntelliJ, потому что он не может найти класс.

Это не приложение для Android, а приложение для малины Pi.

4b9b3361

Ответ 1

Вам необходимо вручную включить обработку аннотаций для IntelliJ: в настройках... → Сборка, выполнение, развертывание → Компилятор → Обработчики аннотации, установите флажок Включить обработку аннотаций и Получить процессоры из пути к классу проекта.

Ответ 2

Я нашел решение.

https://github.com/tbroyer/gradle-apt-plugin

buildscript {
  repositories {
    maven {
      url "https://plugins.gradle.org/m2/"
    }
  }
  dependencies {
    classpath "net.ltgt.gradle:gradle-apt-plugin:0.3"
  }
}

apply plugin: "net.ltgt.apt"

dependecies {
  apt 'com.google.dagger:dagger-compiler:2.0.1'
  compile 'com.google.dagger:dagger:2.0.1'
}

Кроме того, если вы используете Intellij, рекомендуется следующая конфигурация:

При использовании интеграции Gradle в IntelliJ IDEA, а не в идее, вам придется вручную активировать обработку аннотаций: в настройках... → сборка, выполнение, развертывание → компилятор → обработчики аннотации, установите флажок Включить обработку аннотаций и Получить процессоры из класса проекта classpath. Чтобы имитировать поведение поведения и генерируемых файлов Gradle, вы можете настроить каталоги исходных и тестовых источников на сборку/сгенерированную/исходную/apt/main и build/generated/source/apt/test соответственно и выбрать Сохранить созданные источники по отношению к: Корень содержимого модуля. Мне также пришлось удалить Исключить из целого каталога сборки и пометить сгенерированный каталог /source/apt/main как источник.

Ответ 3

Я знаю, что проще всего использовать плагин apt-idea

Просто активируйте плагин в файле build.gradle:

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

и затем добавьте процессоры annotationProcessor конфигурацию annotationProcessor:

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

Я создал очень простой тест-проект на GitHub: ex.dagger
(с использованием IntelliJ 2018.1.4, Gradle 4.7)

Ответ 4

Я тоже не мог заставить ни один из плагинов работать, поэтому, основываясь на ответе Стефана, я сделал следующее, которое работает, но раздражающе IntelliJ, похоже, создает групповые модули, которых раньше не было. Будьте здоровы, если кто-нибудь знает, что вызывает это, я бы очень хотел, чтобы это было исправлено.

apply plugin: 'java'
apply plugin: 'idea'

configurations {
    compileDagger
}

def genPath = new File(buildDir,"generated/source/apt/main" )

task createGenPath << {
    if(!genPath.exists()){
        genPath.mkdirs()
    }
}

compileJava.dependsOn(createGenPath)

compileJava {
    source += genPath
    classpath += configurations.compileDagger
    options.compilerArgs += ['-s', genPath]
}

idea.module {
    sourceDirs += genPath
}

dependencies {
    compileDagger "com.google.dagger:dagger-compiler:${dagger2Version}"
    compile "com.google.dagger:dagger:${dagger2Version}"
}

Ответ 5

Я закончил со следующим решением (и он, кажется, самый простой из всех отправленных ответов):

apply plugin: 'java'
apply plugin: 'idea'

def generatedMain = new File(buildDir, "generated/main")

compileJava {
    doFirst {
        generatedMain.mkdirs()
    }
    options.compilerArgs += ['-s', generatedMain]
}
idea.module.sourceDirs += generatedMain

dependencies {
    compileOnly 'com.google.dagger:dagger-compiler:2.8'
    compile 'com.google.dagger:dagger:2.8'
}

Ответ 6

У меня были проблемы с существующими плагинами, поэтому я добавил следующее в build.gradle:

def daggerVersion = "2.4"

// APT >>
def genPath = new File(buildDir,"generated/java/APT" )

task createGenPath << {
    if(!genPath.exists()){
        genPath.mkdirs()
    }
}
compileJava.dependsOn(createGenPath)

compileJava {
     options.compilerArgs << '-s' << genPath
}
// APT <<


dependencies {
    compile "com.google.dagger:dagger:$daggerVersion"
    compile "com.google.dagger:dagger-compiler:$daggerVersion"
}

// APT IDEA >>
idea.module {
    sourceDirs += genPath
    // maybe add to generatedSourceDirs
    iml {
        withXml {
            File ideaCompilerXml = project.file('.idea/compiler.xml')
            if (ideaCompilerXml.isFile()) {
                Node parsedProjectXml = (new XmlParser()).parse(ideaCompilerXml)
                updateIdeaCompilerConfiguration(parsedProjectXml)
                ideaCompilerXml.withWriter { writer ->
                    XmlNodePrinter nodePrinter = new XmlNodePrinter(new PrintWriter(writer))
                    nodePrinter.setPreserveWhitespace(true)
                    nodePrinter.print(parsedProjectXml)
                }
            }
        }
    }
}

static void updateIdeaCompilerConfiguration( Node projectConfiguration) { //actually resets APT
    Object compilerConfiguration = projectConfiguration.component.find { [email protected] == 'CompilerConfiguration' }
    compilerConfiguration.annotationProcessing.replaceNode{
        annotationProcessing() {
            profile(default: 'true', name: 'Default', enabled: 'true') {
                sourceOutputDir(name: '')
                sourceTestOutputDir(name: '')
                outputRelativeToContentRoot(value: 'true')
                processorPath(useClasspath: 'true')
            }
        }
    }
}
// APT IDEA <<

Ответ 7

В моем случае проблема заключалась в создании IDEA отдельного модуля для созданных кинжалом файлов. Мне нужно было перейти в File -> Project Structure -> Modules и удалить модуль projectname_dagger (нажав красный минус), а затем добавить сгенерированную исходную папку в мой модуль projectname_main, нажав Add Content Root и выбрав его.

По какой-то причине мне пришлось удалить файлы Dagger и позволить IDEA восстановить их, потому что я получал ошибки в дублирующих файлах в проекте.

Теперь это работает, событие с отключением обработчиков аннотаций (я подозреваю, что они должны в основном быть важными для проектов Android).

Ответ 8

Начиная с версии 0.11 net.ltgt.apt (февраль 2018 года) вы можете просто применить плагин net.ltgt.apt-idea для build.gradle:

plugins {
    id "net.ltgt.apt-idea" version "0.18"
}

apply plugin: 'idea'
apply plugin: 'java'

dependencies {
    compile             "com.google.dagger:dagger:2.17"
    annotationProcessor "com.google.dagger:dagger-compiler:2.17"
}

Ответ 9

Используя IntelliJ IDEA 2019.1 и Gradle 5.4.1, этого кажется достаточно:

plugins {
    id 'java'
}

version '1.0-SNAPSHOT'

sourceCompatibility = 1.8

repositories {
    mavenCentral()
}

dependencies {
    testImplementation group: 'junit', name: 'junit', version: '4.12'

    implementation 'com.google.dagger:dagger:2.23.1'
    annotationProcessor 'com.google.dagger:dagger-compiler:2.23.1'
}

Я не знаю минимальные версии, для которых это решение работает, хотя.