#android #gradle #build #annotation-processing
#Android #gradle #сборка #обработка аннотаций
Вопрос:
У меня проблема со сборкой Gradle. В моем проекте я использую процессор аннотаций, созданный мной самим. Этот процессор генерирует некоторые исходные файлы на последнем этапе обработки. В сгенерированных файлах есть один конкретный класс (Revolver), на который ссылается код проекта. Проблема в том, что Gradle, похоже, запускает процессор аннотаций и компиляцию одновременно. Это выдает ошибку, поскольку сгенерированные классы не готовы и, следовательно, не найдены.
Чтобы убедиться в этом, я добавил некоторые журналы отладки.
Note: Starting Revolver Injector generation
Note: Starting Revolver Component Provider generation
Note: Starting Revolver Injector generation
Note: Starting Revolver Component Provider generation
E:workspaceAndroid Studiofix-in-produzionebranchesvideocurriculum-client-androidappsrcmainjavacoauraspherevideocurriculumviewactivityNetworkBaseActivity.java:14: error: cannot find symbol
import co.aurasphere.revolver.Revolver;
^
symbol: class Revolver
location: package co.aurasphere.revolver
Note: Starting Revolver Injector generation
warning: File for type 'co.aurasphere.revolver.Revolver' created in the last round will not be subject to annotation processing.
Note: Starting Revolver Component Provider generation
warning: File for type 'co.aurasphere.revolver.RevolverComponentProvider' created in the last round will not be subject to annotation processing.
1 error
2 warnings
Как вы можете видеть, после ошибки от процессора аннотаций поступает больше выходных данных (помеченных «Примечание:»).
Это безупречно работает с Maven и использовалось для работы с Gradle 1.5. Теперь я использую Gradle 2.14.
Кто-нибудь может объяснить мне, изменилось ли что-то и / или как я могу решить эту проблему?
Это мои файлы gradle:
main.gradle
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {
jcenter()
mavenLocal()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.2.1'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
jcenter()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
app.gradle
apply plugin: 'com.android.application'
android {
compileSdkVersion 24
buildToolsVersion "24.0.3"
dataBinding{
enabled true
}
defaultConfig {
applicationId "co.aurasphere.videocurriculum"
minSdkVersion 15
targetSdkVersion 24
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_6
targetCompatibility JavaVersion.VERSION_1_6
incremental false
}
}
repositories {
mavenLocal()
}
preBuild.dependsOn clean
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
// Revolver
compile 'co.aurasphere.revolver:revolver:0.0.1'
annotationProcessor 'co.aurasphere.revolver:revolver-compiler:0.0.1-SNAPSHOT'
// Butterknife dependencies
annotationProcessor 'com.jakewharton:butterknife-compiler:8.0.1'
compile 'com.jakewharton:butterknife:8.0.1'
// Retrofit
compile 'com.squareup.retrofit:retrofit:2.0.0-beta2'
compile 'com.squareup.retrofit:converter-gson:2.0.0-beta2'
compile 'com.squareup.okhttp:logging-interceptor:2.7.5'
// Otto
compile 'com.squareup:otto:1.3.8'
// Support libraries
compile 'com.android.support:appcompat-v7:24.0.0'
compile 'com.android.support:design:24.2.1'
compile 'com.android.support:support-v4:24.0.0'
compile 'com.android.support:recyclerview-v7:24.0.0'
}
Спасибо.
Комментарии:
1. Почему вы создаете классы после последнего раунда? Рассматривали ли вы возможность сделать это во время начальных раундов вместо этого?
2. @user1643723 Я пробовал, но поскольку я работаю с теми же файлами, я получаю исключение FilerException: Попытка воссоздать файл. Итак, я пишу только один раз, в последнем раунде.
3. Я не уверен, что это все еще работает, но в официальной документации упоминается сохранение открытого файла и добавление «хвоста» во время последнего раунда. Возможно, стоит попробовать (хотя бы для того, чтобы посмотреть, как разные версии компилятора приводят к ужасному сбою). Является ли обнаружение
Revolver
с помощью отражения опцией?4. Я знаю, что это довольно старый вопрос, но я могу с уверенностью сказать, что порядок здесь не является проблемой. Обработка аннотаций происходит во время компиляции, это особенность компилятора Java. Процесс работает по существу следующим образом: чтение и анализ исходных файлов -> Обработка аннотаций -> Компиляция исходного кода. Таким образом, если сгенерированный класс был бы успешно сгенерирован, он был бы найден к моменту начала компиляции. Проблема, должно быть, в чем-то совершенно другом. Однако, не видя исходного кода, невозможно сказать, в чем конкретно может заключаться проблема.
5. @XaverKapeller этот вопрос все еще открыт, и я пока не нашел решения. После нескольких дней отладки я тоже пришел к такому выводу. Странно то, что Android Studio может разрешить исходные коды, поэтому, возможно, что-то с плагином apt не может поместить классы в нужную папку? Я действительно не знаю, у меня очень мало знаний о Gradle, но я все еще не сдаюсь!