#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 интересна только для вызова сгенерированного кода на самом деле).