Kotlin Аннотационный процессор + AutoService

У меня возникла следующая проблема: – Создано несколько модулей, которые реализуют класс Component и его аннотируют с помощью @AutoService(Component::class) – Мое приложение для Android использует ServiceLoader для извлечения этих классов. Но по какой-то причине kapt не создает файлы внутри META-INF/services/...

Мой модуль gradle.file:

 apply plugin: 'com.android.library' apply plugin: 'kotlin-android' apply plugin: 'kotlin-kapt' android { compileSdkVersion 26 buildToolsVersion "26.0.2" defaultConfig { minSdkVersion 19 targetSdkVersion 26 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" javaCompileOptions { annotationProcessorOptions { includeCompileClasspath = true } } } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation 'com.android.support:appcompat-v7:26.1.0' implementation 'com.android.support.constraint:constraint-layout:1.0.2' implementation 'com.android.support:design:26.1.0' testImplementation 'junit:junit:4.12' androidTestImplementation 'com.android.support.test:runner:1.0.1' androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1' implementation project(':common-dependencies') implementation project(':component') compileOnly 'com.google.auto.service:auto-service:1.0-rc3' kapt "com.google.auto.service:auto-service:1.0-rc3" compile "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version" } 

Мое приложение build.gradle file:

 apply plugin: 'com.android.application' apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' apply plugin: 'kotlin-kapt' android { compileSdkVersion 26 buildToolsVersion "26.0.2" defaultConfig { applicationId "com.test.sampleapp" minSdkVersion 19 targetSdkVersion 26 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" javaCompileOptions { annotationProcessorOptions { includeCompileClasspath = true } } } flavorDimensions 'required-notused' productFlavors { brandA { resValue "string", "app_name", "Brand A" } brandB { resValue "string", "app_name", "Brand B" } all { applicationIdSuffix ".${it.name.toLowerCase()}" } } buildTypes { debug release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation 'com.android.support:appcompat-v7:26.1.0' implementation 'com.android.support.constraint:constraint-layout:1.0.2' implementation 'com.android.support:design:26.1.0' testImplementation 'junit:junit:4.12' androidTestImplementation 'com.android.support.test:runner:1.0.1' androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1' implementation project(':common-dependencies') implementation project(':component') brandAImplementation project(':city-picker') brandAImplementation project(':profile') brandAImplementation project(':matches') brandAImplementation project(':chat') brandBImplementation project(':city-picker') brandBImplementation project(':chat') compileOnly 'com.google.auto.service:auto-service:1.0-rc3' kapt "com.google.auto.service:auto-service:1.0-rc3" compile "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version" } repositories { mavenCentral() } 

Я не уверен, почему, но kapt в основном не генерирует эти файлы. Если я использую классы Java, он генерирует его мгновенно. Почему?

Вы можете попробовать это

kapt { correctErrorTypes = true }

https://kotlinlang.org/docs/reference/kapt.html

Я сделал обходное решение, чтобы заставить его работать (не гордясь этим). Мне пришлось создать экземпляр моего собственного процессора и переопределить обработчик, чтобы всегда возвращать false. Кажется, что kapt хранит кеш моего ресурса, и после очистки сборки он больше не генерирует файлы.

Вот это код:

 public class CustomAutoServiceProcessor extends AutoServiceProcessor { public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) { try { Field processingOver = roundEnv.getClass().getDeclaredField("processingOver"); processingOver.setAccessible(true); processingOver.set(roundEnv, false); } catch (NoSuchFieldException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } return super.process(annotations, roundEnv); } } 

Любое лучшее предложение приветствуется!

Intereting Posts
Разбор json со сломанным удаленным API Kotlin – Наследовать от Java-класса, который реализует Parcelable Ошибка обратного вызова OnSuccessListener Firebase Storage kotlin внутренний класс can not доступ к закрытому методу снаружи? Выбор стратегии через конфигурацию JSON Почему компилятор Kotlin требует явного инициализатора свойства var? Как использовать делегаты разрешения библиотеки поддержки Android? Использование EventBus для завершения операции из базовой операции? Spring PropertySources загружены, но не применяются в тестах Обобщить метод с нулевыми аргументами и возвращаемым типом : задача kaptReleaseKotlin не работает на Jenkins (но работает на локальной машине) Как обеспечить общий тип с помощью взаимодействия Kotlin Kotlin: как обрабатывать функцию любого типа ввода и заданного типа вывода Использовать ExpectedException с Kotlin Ошибка сборки после обновления до Android Studio 3.0 с помощью Kotlin