格拉德尔+;AndroidAnnotations生成重复的类错误-需要在每次生成之前清理项目

格拉德尔+;AndroidAnnotations生成重复的类错误-需要在每次生成之前清理项目,android,gradle,android-studio,android-annotations,annotation-processing,Android,Gradle,Android Studio,Android Annotations,Annotation Processing,我在使用gradle版本将IntelliJ IDEA项目迁移到Android Studio时遇到问题。我已经建立了AndroidAnnotations库,就像在其他各种帖子中推荐的那样,它工作得很好。但是,当多次编译我的项目而不在其间执行:clean任务时,我会收到以下错误消息: /project-dir/build/source/apt_generated/flavor1/release/com/example/app/MyActivity_.java:15: error: duplicate

我在使用gradle版本将IntelliJ IDEA项目迁移到Android Studio时遇到问题。我已经建立了AndroidAnnotations库,就像在其他各种帖子中推荐的那样,它工作得很好。但是,当多次编译我的项目而不在其间执行
:clean
任务时,我会收到以下错误消息:

/project-dir/build/source/apt_generated/flavor1/release/com/example/app/MyActivity_.java:15: error: duplicate class: com.example.app.MyActivity_

[more errors here...]
我认为多个串联构建失败是因为AndroidAnnotations总是在
:compile
任务之前重新创建
*.\java
文件(不检查是否有必要),并且
:compile
任务识别新文件(例如使用时间戳)但是已经找到了预编译的
*.class
文件,因此抛出了错误。这可能吗?如何防止这种行为?我可以为AndroidAnnotations添加必要性检查吗?还是其他问题


更新1:错误似乎是由AndroidAnnotations本身引发的,因为当我手动删除
生成的
文件夹中的
*.java
文件时,
:compile
起作用


更新2:

我从我的
build.gradle中删除了以下行:

// Automatically add the generated source code to the source set
android.sourceSets[getSourceSetName(variant)].java.srcDirs += aptOutput
我不知道为什么没有这条线它能工作。因为我没有使用Android Studio的
将目录标记为>Sources Root
添加文件夹。这可能是缓存的某种结果?还是gradle会自动将生成的java文件添加到类路径

尽管如此,我仍将感谢您的任何评论


更新3/解决方案

删除该行并将gradle构建文件与androidstudio同步后,自动生成的源代码作为源根被删除,导致IDE显示缺少类的错误


最终,我找到了Android注释github问题的解决方案:

我重新添加了将其添加到源代码集中的语句(允许AndroidStudio将其显示为源代码根)。此外,我使用以下方法从变体源集合中删除了文件:

variant.javaCompile.source = variant.javaCompile.source.filter { p ->
    return !p.getPath().startsWith(aptOutputDir.getPath())
}
variant.javaCompile.source = variant.javaCompile.source.filter { p ->
    return !p.getPath().startsWith(aptOutputDir.getPath())
}
现在,生成的文件已被识别,重复类错误也消失了

致以最良好的祝愿, 大卫

这是我的最终版本,格雷德尔。我希望这对你们中的一些人有所帮助:

buildscript {
    repositories {
        mavenCentral()
    }

    dependencies {
        classpath 'com.android.tools.build:gradle:0.5.+'
    }
}

apply plugin: 'android'

repositories {
    mavenCentral()
}

configurations {
    // This is the annotations processor dependency configuration.
    apt
}

def getSourceSetName(variant) {
    return new File(variant.dirName).getName();
}

android {
    compileSdkVersion 18

    defaultConfig {
        versionCode 10
        versionName "1.0.2"
        targetSdkVersion 17
        minSdkVersion 10
    }

    buildToolsVersion "18.0.1"

    buildTypes {
        release {
            zipAlign true
        }
    }

    productFlavors {
        flavor1 {}
        flavor2 {}
    }

    // This has to go after the productFlavors command (otherwise moving the flavor source set root fails).
    sourceSets {
        main {
            manifest.srcFile 'AndroidManifest.xml'
            java.srcDirs = ['src']
            resources.srcDirs = ['src']
            aidl.srcDirs = ['src']
            renderscript.srcDirs = ['src']
            res.srcDirs = ['res']
            assets.srcDirs = ['assets']
        }

        // We move the root of our flavors to support our legacy structure.
        flavor1.setRoot('flavors/flavor1')
        flavor2.setRoot('flavors/flavor2')
    }

    applicationVariants.all { variant ->
        def aptOutputDir = project.file("${project.buildDir}/source/apt_generated")
        def aptOutput = new File(aptOutputDir, variant.dirName)

        println "****************************"
        println "variant: ${variant.name}"
        println "manifest:  ${variant.processResources.manifestFile}"
        println "aptOutput:  ${aptOutput}"
        println "****************************"

        android.sourceSets[getSourceSetName(variant)].java.srcDirs+= aptOutput.getPath()

        variant.javaCompile.doFirst {
            println "*** Running AndroidAnnotations for ${variant.name}"
            aptOutput.mkdirs()


            variant.javaCompile.options.compilerArgs += [
                    '-processorpath', configurations.apt.getAsPath(),
                    '-AandroidManifestFile=' + variant.processResources.manifestFile,
                    '-s', aptOutput
            ]
        }

        variant.javaCompile.source = variant.javaCompile.source.filter { p ->
            return !p.getPath().startsWith(aptOutputDir.getPath())
        }
}

dependencies {
    // Android-Annotations
    apt 'com.googlecode.androidannotations:androidannotations:2.7.1'
    compile 'com.googlecode.androidannotations:androidannotations-api:2.7.1'

    // Include libraries only in flavor1
    flavor1Compile fileTree(dir: 'libs', include: '*.jar')
}

这是我的(初始)
build.gradle
(我去掉了不相关的部分):

我将感谢任何帮助

谢谢,
David

最终,我找到了Android注释github问题的解决方案:

我重新添加了将其添加到源代码集中的语句(允许AndroidStudio将其显示为源代码根)。此外,我使用以下方法从变体源集合中删除了文件:

variant.javaCompile.source = variant.javaCompile.source.filter { p ->
    return !p.getPath().startsWith(aptOutputDir.getPath())
}
variant.javaCompile.source = variant.javaCompile.source.filter { p ->
    return !p.getPath().startsWith(aptOutputDir.getPath())
}
现在,生成的文件已被识别,重复类错误也消失了


最好的问候,David

如果您从Eclipse导出build.gradle,它包括在gradle文件中生成的.apt_,它不应该。去掉这个,这些错误就会消失。

我的情况就是这样。顺便说一下,您应该删除的生成文件位于app/src/main/java/your/package/name中。