【问题标题】:FindBugs Android Gradle No classes configured errorFindBugs Android Gradle 没有类配置错误
【发布时间】:2013-12-11 08:58:45
【问题描述】:

我正在尝试在 Android 版本中使用适用于 Gradle 的 FindBugs 插件。

build.gradle 文件

buildscript {
  repositories {
    mavenCentral()        
  }
  dependencies {
    classpath 'com.android.tools.build:gradle:0.6.+'
  }
}
apply plugin: 'android'
apply plugin: 'findbugs'

android {
  compileSdkVersion 19
  buildToolsVersion "19.0.0"
  defaultConfig {
    minSdkVersion 8
    targetSdkVersion 19        
  }
}

dependencies {
  compile 'com.android.support:appcompat-v7:+'
}

但是当我执行check 任务时,它说

没有为 FindBugs 分析配置类。

如何为 FindBugs 分析配置类?

【问题讨论】:

    标签: android gradle findbugs


    【解决方案1】:

    目前这是不可能的,因为 findbugs 期望 Gradle 的普通 Java SourceSets 但 android 插件使用自定义的。

    Gradle 和 Android 插件都计划进行工作,以允许使用默认的 SourceSets,这将启用 FindBugs。

    您在此处跟踪此问题:https://code.google.com/p/android/issues/detail?id=55839

    【讨论】:

      【解决方案2】:

      在较新版本的 Android Studio 中,此问题可能归因于 classes 目录的位置已更改。

      新位置(截至 0.8.2)是:

      build/intermediates/classes/{build_variant_name}/
      

      例如

      build/intermediates/classes/debug/
      
      task findbugs(type: FindBugs) {
          excludeFilter = file('config/findbugs/findbugs.xml')
          ignoreFailures = true
          classes = fileTree('build/intermediates/classes/preproduction/')
          source = fileTree('src/main/java/')
          classpath = files()
          effort = 'max'
          reports {
              xml {
                  destination "reports/findbugs.xml"
              }
          }
      }
      

      【讨论】:

        【解决方案3】:

        这绝对是可能的。至少现在。 答案可见底部https://gist.github.com/rciovati/8461832

        apply plugin: 'findbugs'
        
        // android configuration
        
        findbugs {
            sourceSets = []
            ignoreFailures = true
        }
        
        task findbugs(type: FindBugs, dependsOn: assembleDebug) {
        
            description 'Run findbugs'
            group 'verification'
        
            classes = fileTree('build/intermediates/classes/debug/')
            source = fileTree('src/main/java')
            classpath = files()
        
            effort = 'max'
        
            excludeFilter = file("../config/findbugs/exclude.xml")
        
            reports {
                xml.enabled = true
                html.enabled = false
            }
        }
        
        check.doLast {
            project.tasks.getByName("findbugs").execute()
        }
        

        这里重要的部分是dependsOn: assembleDebug。 否则,您将收到 No classes configured for FindBugs analysis 错误消息。

        请参阅此https://stackoverflow.com/a/7743935/1159930 以获取排除文件。

        【讨论】:

        • 我错过了 dependsOn 并在我第一次清理时遇到了同样的问题。谢谢!
        【解决方案4】:

        我能够解决问题

        通过将查找错误添加为单独的任务

         task findbugs(type: FindBugs) {
            ignoreFailures = true
            classes = fileTree('build/classes/debug/')
            source = fileTree('src/main/java/')
            classpath = files()
           effort = 'max'
         }
        

        此任务可以使用

        运行
        gradle findbugs
        

        如果您使用的是 android-test 插件,您必须在构建时排除 findbugsTestDebug 任务。

        gradle build -x  findbugsTestDebug
        

        【讨论】:

        • 请注意,如果您不使用任何其他源文件夹、风格或构建类型,这可以正常工作。我在下面关于缺乏集成的回答是关于真正的集成,无论您如何配置您的 android 项目,也无论您的代码位于何处(在主要源集中、风味源集中等......)
        【解决方案5】:

        我必须为 findbugs 指定默认的 sourceSet。最初它不存在,所以我收到了错误。

            findbugs {
            sourceSets = []    //Default sourceSet
            toolVersion = "3.0.1"      
            ignoreFailures = true      
            reportsDir = file("$project.buildDir/findbugsReports")
            effort = "max"
            reportLevel = "low"
        }
        

        【讨论】:

          【解决方案6】:

          正如其他人所写,您必须设置sourceSets,即:

          task findbugs(type: FindBugs) {
              // ignoreFailures = false
              ignoreFailures = true
              effort = 'max'
              reportLevel = 'low'
              excludeFilter = file("quality/findbugs/findbugs-filter.xml")
              classes = files("${project.buildDir}/intermediates/javac/debug/classes",
          
              source "${file(getProjectDir().getPath()).getAbsolutePath()}/src"
              include '**/*.java'
              exclude "${project.buildDir}/generated/**/*.java"
          
              reports {
                  xml.enabled = true
                  xml {
                      destination file("findbugs/report.xml")
                  }
                  /*
                  html.enabled = true
                  html {
                      destination file("findbugs/report.html")
                  }
                  */
                  /*
                  text.enabled = true
                  text {
                      destination file("findbugs/report.txt")
                  }
                  */
              }
          
              classpath = files()
          }
          
          

          问题是当你升级 Android Gradle Plugin 版本时,这条路径会时不时地改变。

          在我们不同时期的项目中,它具有以下价值:

          "${project.buildDir}/intermediates/classes/debug"
          "${project.buildDir}/intermediates/javac/debug/compileDebugJavaWithJavac/classes"
          "${project.buildDir}/intermediates/javac/debug/classes"
          

          因此,如果上述值均无效,请尝试在您的构建树中找到实际的类,也许他们只是再次更改了它。

          【讨论】:

            猜你喜欢
            • 2018-06-23
            • 1970-01-01
            • 1970-01-01
            • 2013-06-30
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-03-09
            • 2019-03-25
            相关资源
            最近更新 更多