3

我正在努力为多模块项目正确设置 SonarQube 5.4。我在这里这里这里读过,所有提供的解决方案都不能解决我的错误:我在对我创建的每个类(不是我包含的库)进行声纳分析期间收到警告:

“无法通过 ClassLoader 访问 XYZ 类。”

而且我在 Sonar 仪表板中没有得到任何结果(在 localhost 和 Jenkins 上都没有),甚至分析的时间也没有更新。我正在使用 Gradle 2.10,这是我的根 Gradle 文件:

buildscript {
repositories {
    jcenter()
    mavenCentral()
    maven {
        url "https://plugins.gradle.org/m2/"
    }
}
dependencies {
    classpath 'com.android.tools.build:gradle:2.0.0'
    classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
    classpath "org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:2.0-rc1"
    // NOTE: Do not place your application dependencies here; they belong
    // in the individual module build.gradle files
    }
}
apply from: 'buildsystem/dependencies.gradle'
apply plugin: "org.sonarqube"

subprojects {
sonarqube {
    properties {
        property "sonar.host.url", "http://localhost:9000/"
        property "sonar.sources", "./src/main/java"
        property "sonar.java.binaries", "./build/"
        property "sonar.projectKey", "net.project"
        property "sonar.projectName", "Project Android"
        property "sonar.projectVersion", "0.5"
        property "sonar.sourceEncoding", "UTF-8"
        }
    }
}
allprojects {
ext {
    androidApplicationId = 'net.project'
    androidVersionCode = 1
    androidVersionName = "0.5"
    testInstrumentationRunner = "android.support.test.runner.AndroidJUnitRunner"
    testApplicationId = 'com.beatclip.android.presentation.test'
    }

repositories {
    jcenter()
    }
}

task wrapper(type: Wrapper) {
description 'Creates the gradle wrapper.'
gradleVersion '2.10'
}

可能是 Dagger2 的问题吗?我在模块集的 Gradle 文件中没有 SonarQube 配置,因为来自 SonarQube 的这个示例也没有在模块 Gradle 文件中提供任何 Sonar 配置。

任何帮助或示例表示赞赏!:)

4

1 回答 1

0

虽然我不知道 gradle 发生了什么以及如何正确设置它,但我以某种方式设法在扫描中获得了部分更好的结果(仍然有些类无法加载,但主要是外部类,所以我希望扫描至少可以工作在内部的)。

我正在使用 sonarqube 插件 2.0.1、sonarqube 4.5.7、gradle 2.14.1。

我正在为最终的应用程序模块设置它,所以这不会直接帮助您使用“多模块”,但也许可以将类似的东西放入subprojects其中?由于我不了解 groovy (1),因此改变任何东西对我来说都非常困难和痛苦,我花了几个小时才设法至少到达这里。

(1)我尝试编写的任何东西都以我预期的方式工作,例如,我希望将classFilesTree(文件树实例)直接添加到property "sonar.java.binaries"足以遍历文件,但我最终得到了 collect + {}.each在设置属性之前扩展它(当时我遇到了几个问题,所以我不确定这是正确的步骤,现在它可以工作了,所以我不打算进行实验)。我根本不懂这些高级语言,我永远无法想象它是如何落在 CPU 上的,以及在内存中执行什么,所以我很挣扎,我的大脑被训练为处理字节,而不是抽象。

plugins {  //instead of the old way with dependecies + apply plugin
    id "org.sonarqube" version "2.0.1"
}

// path to Android SDK jar file, requires sdk.dir=/path/file in local.properties
def androidSdkJarPath;
afterEvaluate {
    def rootDir = project.rootDir
    def localProperties = new File(rootDir, "local.properties")
    if (localProperties.exists()) {
        Properties properties = new Properties()
        localProperties.withInputStream { instr ->
            properties.load(instr)
        }
        def sdkDir = properties.getProperty('sdk.dir')
        androidSdkJarPath = sdkDir + "/platforms/" + android.compileSdkVersion + "/android.jar"
        logger.info('androidSdkJarPath: ' + androidSdkJarPath)
    }
}

sonarqube {
    properties {
        // ... other module configuration for sonar...

        FileTree classFilesTree = fileTree(dir: 'build/intermediates/classes', include: '**/release/**')
        FileTree jarFilesFromAarsTree = fileTree(dir: 'build/intermediates/exploded-aar', include: '**/jars/*.jar', exclude: ['**/debug/jars/**', '**/snapshot/jars/**'])

        def classFiles = []
        def jarFilesFromAars = []
        classFilesTree.collect { relativePath(it) }.each { classFiles += it }
        jarFilesFromAarsTree.collect { relativePath(it) }.each { jarFilesFromAars += it }
//        logger.warn('classFiles: ' + classFiles )
//        logger.warn('jarFilesFromAars: ' + jarFilesFromAars )
        // Still MIA (on my project): android.support.v4.**, ...

        property "sonar.java.binaries", classFiles
        property "sonar.libraries", [jarFilesFromAars, androidSdkJarPath]
    }
}

subprojects {
    sonarqube {
        properties["sonar.sources"] += "src/main/java"
        properties["sonar.test"] += ["src/androidTest/java", "src/test/java"]
    }
}
于 2016-08-04T09:55:17.193 回答