【问题标题】:SonarQube doesn't work with Intellij Community 2019.2SonarQube 不适用于 Intellij 社区 2019.2
【发布时间】:2020-01-08 19:14:00
【问题描述】:

我通过将项目绑定到我们的 SonarQube(安装了 SonarJava 5.3 (build 13828))服务器来使用带有 IntelliJ Community 2019.2 版本的 SonarLint 4.1.1.3345。但是,我从 SonarLint 日志中收到以下堆栈跟踪错误:

Java Main Files AST scan
60 source files to be analyzed
Unable to create symbol table for : C:\Users\username\SomeFile.java
java.lang.IllegalArgumentException: Unsupported class file major version 55
    at org.objectweb.asm.ClassReader.<init>(ClassReader.java:166)
    at org.objectweb.asm.ClassReader.<init>(ClassReader.java:148)
    at org.objectweb.asm.ClassReader.<init>(ClassReader.java:136)
    at org.sonar.java.resolve.BytecodeCompleter.loadClass(BytecodeCompleter.java:204)
    at org.sonar.java.resolve.Symbols.<init>(Symbols.java:176)
    at org.sonar.java.resolve.SemanticModel.createFor(SemanticModel.java:59)
    at org.sonar.java.model.VisitorsBridge.visitFile(VisitorsBridge.java:110)
    at org.sonar.java.ast.JavaAstScanner.simpleScan(JavaAstScanner.java:96)
    at org.sonar.java.ast.JavaAstScanner.scan(JavaAstScanner.java:68)
    at org.sonar.java.JavaSquid.scanSources(JavaSquid.java:116)
    at org.sonar.java.JavaSquid.scan(JavaSquid.java:110)
    at org.sonar.plugins.java.JavaSquidSensor.execute(JavaSquidSensor.java:93)
    at org.sonarsource.sonarlint.core.analyzer.sensor.SensorsExecutor.executeSensor(SensorsExecutor.java:81)
    at org.sonarsource.sonarlint.core.analyzer.sensor.SensorsExecutor.execute(SensorsExecutor.java:72)
    at org.sonarsource.sonarlint.core.container.analysis.AnalysisContainer.doAfterStart(AnalysisContainer.java:132)
    at org.sonarsource.sonarlint.core.container.ComponentContainer.startComponents(ComponentContainer.java:125)
    at org.sonarsource.sonarlint.core.container.ComponentContainer.execute(ComponentContainer.java:110)
    at org.sonarsource.sonarlint.core.container.storage.StorageAnalyzer.analyze(StorageAnalyzer.java:75)
    at org.sonarsource.sonarlint.core.container.storage.StorageContainerHandler.analyze(StorageContainerHandler.java:82)
    at org.sonarsource.sonarlint.core.ConnectedSonarLintEngineImpl.lambda$analyze$0(ConnectedSonarLintEngineImpl.java:152)
    at org.sonarsource.sonarlint.core.ConnectedSonarLintEngineImpl.withReadLock(ConnectedSonarLintEngineImpl.java:344)
    at org.sonarsource.sonarlint.core.ConnectedSonarLintEngineImpl.withReadLock(ConnectedSonarLintEngineImpl.java:334)
    at org.sonarsource.sonarlint.core.ConnectedSonarLintEngineImpl.analyze(ConnectedSonarLintEngineImpl.java:149)
    at org.sonarlint.intellij.core.ConnectedSonarLintFacade.analyze(ConnectedSonarLintFacade.java:74)
    at org.sonarlint.intellij.core.SonarLintFacade.startAnalysis(SonarLintFacade.java:63)
    at org.sonarlint.intellij.analysis.SonarLintAnalyzer.analyzeModule(SonarLintAnalyzer.java:97)
    at org.sonarlint.intellij.analysis.SonarLintTask.analyze(SonarLintTask.java:176)
    at org.sonarlint.intellij.analysis.SonarLintTask.run(SonarLintTask.java:100)
    at org.sonarlint.intellij.analysis.SonarLintUserTask.run(SonarLintUserTask.java:39)
    at org.sonarlint.intellij.analysis.SonarLintJobManager.lambda$runTask$1(SonarLintJobManager.java:120)
    at com.intellij.openapi.progress.impl.CoreProgressManager.lambda$runProcess$2(CoreProgressManager.java:169)
    at com.intellij.openapi.progress.impl.CoreProgressManager.registerIndicatorAndRun(CoreProgressManager.java:591)
    at com.intellij.openapi.progress.impl.CoreProgressManager.executeProcessUnderProgress(CoreProgressManager.java:537)
    at com.intellij.openapi.progress.impl.ProgressManagerImpl.executeProcessUnderProgress(ProgressManagerImpl.java:59)
    at com.intellij.openapi.progress.impl.CoreProgressManager.runProcess(CoreProgressManager.java:156)
    at org.sonarlint.intellij.analysis.SonarLintJobManager.lambda$runTask$2(SonarLintJobManager.java:120)
    at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
    at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
    at java.base/java.lang.Thread.run(Thread.java:834)

“Unsupported class file major version 55”告诉我,Sonar 用于代码分析的类文件适用于 java 11 版本,而我的类是用 java 7 编译的(我拿了同一个类并用 javap 运行它显示了主要版本51),我什至没有在我的系统上安装 java 11。

因为它适用于我的队友。唯一的区别是他们安装了较低版本的 IntelliJ。所以我下载了 IntelliJ 2019.1.4 并开始工作。

有人可以解释为什么它不适用于更高版本的 IntelliJ 以及为什么会出现上述错误吗?提前致谢!

【问题讨论】:

    标签: sonarqube sonarlint sonarlint-intellij


    【解决方案1】:

    这是关于 IDE/sonarlint/plugin 中类加载器的已知限制:

    https://community.sonarsource.com/t/sonarlint-analysis-fails-on-intellij-2019-2-with-java-11-runtime/12905/3

    https://jira.sonarsource.com/browse/SONARJAVA-3056

    SonarLint 示例

    在 SonarLint IntelliJ 运行环境中,这或多或少是 类路径层次结构:

    JDK -> IntelliJ 类 -> SonarLint (+deps) [child-first] -> Java plugin (+packaged deps) [child-first] -> Squid [parent-first]。所以 假设我们分析一个使用类 X 的类。如果 IntelliJ 的 类加载器恰好也使用类 X(相同的完全限定名称), 这将用于代替分析类路径中提供的 X, 即使它们是类的不同副本(不同的版本, 例如)。

    【讨论】:

    • 感谢@devwebcl,我有一个后续问题:当我不将项目绑定到远程 SonarQube 服务器时,即按照 SonarLint 的“规则”选项卡中定义的规则进行扫描,一切正常。为什么?我认为连接到 SonarQube 服务器模式意味着使用服务器上定义的规则/配置文件。另外我尝试删除目标文件夹,本地扫描仍然有效,那么它是否真的即时编译java文件?它在每种模式下如何工作?我试图找到解释不同模式的文档,但我无法找到。如果您知道的话,能否提供一个链接?非常感谢!
    • 唯一的知识库在票上jira.sonarsource.com/browse/SONARJAVA-3056 它看起来是一个已知的错误,但他们还没有解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-11
    • 1970-01-01
    • 2014-03-24
    • 2017-01-23
    • 2020-11-19
    • 1970-01-01
    相关资源
    最近更新 更多