Как настроить 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.
Ответы
Ответ 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'
}
Я не знаю минимальные версии, для которых это решение работает, хотя.