SonarQube分析SpringBoot项目时遇NoClassDefFoundError问题求助
问题描述
执行SonarQube分析SpringBoot项目时触发NoClassDefFoundError,执行的Maven命令:
mvn clean verify sonar:sonar -Dsonar.projectKey=CartoBack -Dsonar.projectName='CartoBack' -Dsonar.host.url=http://localhost:9000 -Dsonar.token=sqp_a58985a52a9cdd7ad2880e719a0b59cf2ece75b7
报错信息:
[INFO] Total time: 36.938 s [INFO] Finished at: 2024-04-26T09:20:14+01:00 [INFO] ------------------------------------------------------------------------ Exception in thread "Thread-2" java.lang.NoClassDefFoundError: ch/qos/logback/classic/spi/ThrowableProxy at ch.qos.logback.classic.spi.LoggingEvent.<init>(LoggingEvent.java:145) at ch.qos.logback.classic.Logger.buildLoggingEventAndAppend(Logger.java:424) at ch.qos.logback.classic.Logger.filterAndLog_0_Or3Plus(Logger.java:386) at ch.qos.logback.classic.Logger.error(Logger.java:543) at org.eclipse.jgit.internal.util.ShutdownHook.cleanup(ShutdownHook.java:87) at java.base/java.lang.Thread.run(Thread.java:842) Caused by: java.lang.ClassNotFoundException: ch.qos.logback.classic.spi.ThrowableProxy at java.base/java.net.URLClassLoader.findClass(URLClassLoader.java:445) at org.sonarsource.scanner.api.internal.IsolatedClassloader.loadClass(IsolatedClassloader.java:82) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:520) ... 6 more
已尝试添加logback-classic依赖,但作用域为test:
<dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.5.6</version> <scope>test</scope> </dependency>
问题原因与解决办法
原因
SonarQube扫描器的隔离类加载器在执行Eclipse JGit触发的清理钩子时,无法找到logback-classic相关类:
- 你添加的
logback-classic依赖作用域为test,仅在测试阶段生效,而Sonar扫描在verify阶段后执行,无法访问该作用域的依赖; - 若项目依赖
spring-boot-starter-logging(默认包含logback-classic),可能存在依赖被排除或版本冲突的情况,导致扫描时logback类不可用。
解决步骤
调整logback依赖作用域
要么将已添加的logback-classic依赖的scope改为compile(移除<scope>test</scope>),要么直接移除该依赖,确保spring-boot-starter-logging未被排除:<!-- 方式1:调整已有依赖作用域 --> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.5.6</version> </dependency> <!-- 方式2:确保Spring Boot日志starter正常生效 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> <!-- 检查并移除针对logback的exclusions配置 --> </dependency>锁定Sonar Maven插件版本
确保插件版本与SonarQube服务器版本兼容,在pom.xml中明确指定:<build> <plugins> <plugin> <groupId>org.sonarsource.scanner.maven</groupId> <artifactId>sonar-maven-plugin</artifactId> <version>3.10.0.2594</version> <!-- 替换为与服务器匹配的稳定版本 --> </plugin> </plugins> </build>清理Maven缓存
执行命令清理本地仓库缓存,避免依赖冲突:mvn clean install -U检查JGit依赖兼容性
排查项目中JGit依赖的版本,确保其与Sonar扫描器的依赖版本兼容,避免类加载冲突。
内容的提问来源于stack exchange,提问作者user23984628
相关产品推荐
相关产品推荐

