使用Gradle为多模块项目设置SonarQube 5.4:无法通过ClassLoader访问类XYZ

时间:2016-04-20 18:20:08

标签: android gradle sonarqube sonarqube-scan

我正在努力为多模块项目正确设置SonarQube 5.4。我已经阅读了hereherehere,所有提供的解决方案都无法解决我的错误:我在Sonar分析期间为每个创建的课程进行了分析(不适用于库I)包括)警告:

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

我在Sonar仪表板上没有得到任何结果(在本地主机和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配置,因为this example from SonarQube也没有在模块Gradle文件中提供任何Sonar配置。

感谢任何帮助或示例! :)

1 个答案:

答案 0 :(得分: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"]
    }
}