Сначала Gradle не обрабатывает процессор аннотаций

#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, но я все еще не сдаюсь!