【问题标题】:Android: run sonarRunner from gradleAndroid:从 gradle 运行 sonarRunner
【发布时间】:2014-09-27 22:11:52
【问题描述】:

我一直试图让声纳报告与 gradle Android 项目一起运行。因为大多数重要的声纳属性仅在项目是 java 项目时由 sonarRunner gradle plugin 应用,所以我无法将它们应用于 com.android.application 项目。

这是我的 sonarRunner 配置:

sonarRunner {
    sonarProperties {
        property "sonar.sourceEncoding", "UTF-8"
        property "sonar.profile", "Android Lint"
        property "sonar.sources", android.sourceSets.main.java.srcDirs
        property "sonar.binaries", file("${project.buildDir}/intermediates/classes/app") 
        property "sonar.libraries", "" // what to put here?
    }
}

问题是,声纳抱怨找不到类,因为无法引用库。

如何在我的 sonarRunner 配置中引用依赖项 + android 库?


示例错误输出:

INFO  - Load batch settings
INFO  - User cache: C:\Users\mannaz\.sonar\cache
INFO  - Install plugins
INFO  - Install JDBC driver
INFO  - Create JDBC datasource for jdbc:postgresql://sonar.local/sonar?useUnicode=true&characterEncoding=utf8
INFO  - Initializing Hibernate
INFO  - Load project settings
INFO  - Apply project exclusions
WARN  - 'sonar.dynamicAnalysis' is deprecated since version 4.3 and should no longer be used.
INFO  - -------------  Scan app
INFO  - Load module settings
INFO  - Loading technical debt model...
INFO  - Loading technical debt model done: 20 ms
INFO  - Loading rules...
INFO  - Loading rules done: 584 ms
INFO  - Configure Maven plugins
INFO  - Compare to previous analysis (2014-08-05)
INFO  - Compare over 30 days (2014-07-06, analysis of 2014-07-07 11:33:19.0)
INFO  - Compare to previous version (2014-07-21)
INFO  - No quality gate is configured.
INFO  - Base dir: C:\Users\mannaz\workspace\project\app
INFO  - Working dir: C:\Users\mannaz\workspace\project\app\build\sonar
INFO  - Source dirs: C:\Users\mannaz\workspace\project\app\src\main\java
INFO  - Binary dirs: C:\Users\mannaz\workspace\project\app\build\intermediates\classes\app
INFO  - Source encoding: UTF-8, default locale: de_AT
INFO  - Index files
INFO  - 197 files indexed
INFO  - Quality profile for java: Android Lint
INFO  - Sensor JavaSquidSensor...
INFO  - Java Main Files AST scan...
INFO  - 197 source files to be analyzed
ERROR - Class not found: android.widget.RelativeLayout
ERROR - Class not found: android.os.Handler
ERROR - Class not found: android.content.Context
ERROR - Class not found: android.app.Activity
ERROR - Class not found: android.util.AttributeSet
ERROR - Class not found: android.view.View
ERROR - Class not found: com.nostra13.universalimageloader.core.DisplayImageOptions
ERROR - Class not found: com.google.gson.Gson

【问题讨论】:

    标签: gradle android-gradle-plugin sonarqube android-build sonar-runner


    【解决方案1】:

    我猜你只需要使用正确的配置手动设置你的库属性。像这样的:

    sonarRunner {
        sonarProperties {
            property "sonar.sourceEncoding", "UTF-8"
            property "sonar.profile", "Android Lint"
            property "sonar.sources", android.sourceSets.main.java.srcDirs
            property "sonar.binaries", file("${project.buildDir}/intermediates/classes/app") 
            property "sonar.libraries", "android.sourceSets.main.runtimeClasspath"
        }
    }
    

    或者你正确的依赖配置是正确的。

    【讨论】:

    • Or what ever your correct dependency configuration is the right one. 这正是我想知道的:正确的依赖配置是什么?
    • 好吧,我对 android 没有那么丰富的经验。但通常默认为runtimecompile。无论哪种方式,它都应该在您的依赖项块中定义,不是吗?在最坏的情况下,只需遍历“project.dependecies”并添加每个配置;-)
    • 你发现这里应该有什么了吗? property "sonar.libraries", "" // 这里放什么?我有同样的问题,这不起作用:属性“sonar.libraries”,“android.sourceSets.main.runtimeClasspath”
    【解决方案2】:

    我有一个适用于我的多项目 Gradle 构建的解决方案:

    subprojects.each { p ->
        sonarRunner {
            sonarProperties {
                // ... some settings omitted ...
                property p.name + '.sonar.java.binaries', p.sourceSets.main.output.classesDir
                property p.name + '.sonar.java.libraries', p.sourceSets.test.runtimeClasspath.filter { File f -> f.exists() }
            }
        }
    }
    

    请注意

    1. 我使用测试运行时类路径库,因为我们有一个providedCompile 范围,它不会在主运行时类路径中考虑。
    2. 如果库设置包含不存在的目录(例如,因为模块没有 src/main/resources),sonar-runner 会抱怨
    3. 使用了sonar.java.libraries,因为它不适用于我的sonar.libraries

    【讨论】:

    • > p.sourceSets.test.runtimeClasspath.filter { File f -> f.exists() } 为什么要查看测试类路径?我假设这种情况下的库应该是第三方库?
    • @Alix 这与我在源代码下方的第一条评论有关 - 这是因为我在提供编译范围内有依赖项,它们不属于主运行时类路径(因为它们存在于目标系统上),但确实属于测试运行时类路径。
    猜你喜欢
    • 2014-02-23
    • 1970-01-01
    • 2015-02-20
    • 2015-01-17
    • 2014-12-05
    • 2015-02-06
    • 2013-07-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多