Ошибки компиляции с Gradle, Android Studio и Butterknife

#android #gradle #android-studio #butterknife

#Android #gradle #android-studio #butterknife

Вопрос:

Я импортировал проект Eclipse Android в Android Studio, и он не может скомпилироваться со следующими ошибками:

 Error:(7, 8) error: duplicate class: com.company.fragment.PrimaryFragment$$ViewInjector
  

Я попытался добавить плагин apt:

    apply plugin: 'android'
    apply plugin: 'apt'

    android {
        compileSdkVersion 19
        buildToolsVersion "20.0.0"

        defaultConfig {

            minSdkVersion 15
            targetSdkVersion 19
        }

        buildTypes {
            release {
                runProguard false
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
            }
        }

        lintOptions {
            disable 'InvalidPackage'
        }

        packagingOptions {
            exclude 'META-INF/services/javax.annotation.processing.Processor'
        }
    }


dependencies {
    compile project(':library')
    compile 'com.android.support:support-v4: '
    apt "com.jakewharton:butterknife:5.1.1"
    compile 'com.jakewharton:butterknife:5.1.1'

}
  

Я думаю, что это как-то связано с Butterknife. Но когда я создаю чистый проект с его помощью, все в порядке.

Ответ №1:

Если у вас все еще есть целевые папки / папки сборки из eclipse в вашем каталоге сборки, возможно, было бы неплохо удалить их.

Также может помочь очистка проекта в Project -> Clean.

Также, если вы запускаете maven или gradle из командной строки, было бы разумно запустить:

 maven clean
  

или

 gradle clean
  

Комментарии:

1. Почему голосование против. Несмотря на то, что ответ @JakeWharton лучше и пояснительнее, зачем голосовать против?

Ответ №2:

Вам не нужны apt и compile зависимость, только compile зависимость.

При повторном запуске дважды запускается процессор аннотаций (с двумя разными выходными каталогами), что означает, что сгенерированные классы создаются дважды. Ошибка, которую вы видите, связана с тем, что для вашего PrimaryFragment генерируются два идентичных класса.

apt Область видимости (и плагин) необходимы только для библиотек, которые отделяют свои среды выполнения от своих процессоров аннотаций (иногда называемых компиляторами). Примером этого может быть Dagger, в котором есть dagger и dagger-compiler .

Комментарии:

1. Я даже не использую apply plugin: ‘apt’ , но все равно получаю проблему с дублирующимся классом.

2. Это изменится с ButterKnife 8 , это разделит процессор аннотаций и артефакты времени выполнения, что станет чище. На этом этапе вы можете использовать apt scope для процессора аннотаций, хотя предоставленная область также должна работать (область apt интересна только для вызова сгенерированного кода на самом деле).