Поддерживает ли SonarQube Java 8 еще?

В Java 8 выполнение gradle sonarRunner показывает это сообщение об ошибке. (версия sonarQube: 4.2.1)

java.lang.ArrayIndexOutOfBoundsException: 26721
    at org.objectweb.asm.ClassReader.readClass(Unknown Source) [asm-all-3.2.jar:5.0_BETA]
    at org.objectweb.asm.ClassReader.accept(Unknown Source) [asm-all-3.2.jar:5.0_BETA]
    at org.objectweb.asm.ClassReader.accept(Unknown Source) [asm-all-3.2.jar:5.0_BETA]
    at org.sonar.java.bytecode.asm.AsmClassProviderImpl.decoracteAsmClassFromBytecode(AsmClassProviderImpl.java:76) [java-squid-2.0.jar:na]
    at org.sonar.java.bytecode.asm.AsmClassProviderImpl.getClass(AsmClassProviderImpl.java:55) [java-squid-2.0.jar:na]
    at org.sonar.java.bytecode.asm.AsmClassVisitor.visit(AsmClassVisitor.java:52) [java-squid-2.0.jar:na]
    at org.objectweb.asm.ClassReader.accept(Unknown Source) [asm-all-3.2.jar:5.0_BETA]
    at org.objectweb.asm.ClassReader.accept(Unknown Source) [asm-all-3.2.jar:5.0_BETA]
```

Не поддерживает ли SonarQube Java 8? Я хотел бы знать, когда доступна поддержка.

Спасибо.

Ответ 1

SonarQube поддерживает Java 8 с конца марта 2014 года (с некоторыми hickups, которые были исправлены в версии 2.2 его Java-плагина).

Мне пришлось удалить плагины PMD и Checkstyle в центре обновления Sonar, поскольку они не готовы к Java 8. Собственный механизм правильного Sonar Squid должен сделать эти плагины излишними.


Если вы используете Gradle 1.11 для вызова Sonar и хотите, чтобы Jacoco вычислял покрытие кода, вам нужно указать последнюю версию Jacoco для анализа байт-кода Java 8.

Здесь мой script, который делает это при вызове с gradle test jacocoTestReport sonarRunner:

/** This script is responsible for unit testing and static analysis of the project source code*/

apply plugin: "jacoco"
apply plugin: "sonar-runner"

// Location of the XML unit test and code coverage reports 
def testResultsDir = "$buildDir/test-results/" // Use double quotes. Otherwise the $ won't work

jacoco{
    // Gradle 1.11 ships with a Jacoco version that doesn't support Java 8
    toolVersion = "0.7.0.201403182114"
}
// Call "gradle test jacocoTestReport" to produce a code coverage report at "build/reports/jacoco/test/html/index.html"
test {
    jacoco {
        def coverageReport = new File(testResultsDir, "jacocoTest.exec")
        destinationFile = file(coverageReport)
    }
}

// Let SonarQube analyze the project
sonarRunner {
    sonarProperties {
        property "sonar.projectKey", projectId
        property "sonar.projectName", projectName

        property "sonar.junit.reportsPath", testResultsDir

        // Address of SonarQube server
        property "sonar.host.url", "http://localhost:9000"

        // SonarQube stores the test results in this database
        property "sonar.jdbc.url", "jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true"
        property "sonar.jdbc.driverClassName", "com.mysql.jdbc.Driver"
        property "sonar.jdbc.username", "root"
        property "sonar.jdbc.password", sonarDBpassword
    }
}

Ответ 2

На ваш вопрос есть две стороны:

  • СонарРуннер (клиент)
  • Приложение (сервер) SonarQube

Полученная ошибка поступает из плагинов Java Ecosystem, которые загружаются клиенту и опираются на старую версию ASM (3.2). Поддержка AFAIK Java 8 начинается с версии 5.0. У вас будет такая же проблема с Findbugs и Jacoco. См. Также это обсуждение.

Что касается сервера SonarQube, вы можете запустить его, но он вылетает, когда вы выбираете "Configure widgets", поэтому я бы сказал "нет", он еще не поддерживает Java 8.