Docker SonarQube 6.7.1在Java 9环境下导致Maven构建失败如何解决?
解决Java 9环境下SonarQube 6.7.1 Maven扫描失败的问题
这个问题我碰到过好多次,核心原因很明确:Java 9及后续版本把JAXB(Java Architecture for XML Binding)模块从核心JDK中移除了,它变成了可选的外部依赖,但你使用的sonar-maven-plugin:3.4.0.905和SonarQube 6.7.1都是比较老旧的版本,还依赖这个已经被移除的模块,所以在Java 9环境下会找不到javax.xml.bind.ValidationEventHandler类。
下面给你几个按优先级排序的解决方案:
方案1:用Java 8执行Sonar扫描(最稳妥)
SonarQube 6.7.1的官方支持环境就是Java 8,这是最省心的解决办法:
- 如果是在Jenkins上运行,直接给这个Maven任务指定Java 8的JDK就行(在Jenkins的全局配置或者任务的JDK设置里选对应的Java 8路径)
- 本地执行的话,临时切换Java版本到8再跑扫描命令:
export JAVA_HOME=/path/to/your/java8 mvn sonar:sonar
方案2:在Java 9环境下手动引入JAXB依赖
如果必须用Java 9运行,可以通过Maven参数或者pom.xml添加JAXB相关依赖:
方式A:执行命令时添加JVM参数
mvn sonar:sonar -Dmaven.compiler.source=1.8 -Dmaven.compiler.target=1.8 --add-modules java.xml.bind,java.activation
方式B:在pom.xml中添加依赖
<dependencies> <!-- JAXB相关依赖 --> <dependency> <groupId>javax.xml.bind</groupId> <artifactId>jaxb-api</artifactId> <version>2.3.1</version> </dependency> <dependency> <groupId>com.sun.xml.bind</groupId> <artifactId>jaxb-core</artifactId> <version>2.3.0.1</version> </dependency> <dependency> <groupId>com.sun.xml.bind</groupId> <artifactId>jaxb-impl</artifactId> <version>2.3.2</version> </dependency> <!-- 激活模块依赖 --> <dependency> <groupId>javax.activation</groupId> <artifactId>activation</artifactId> <version>1.1.1</version> </dependency> </dependencies>
不过这种方式可能会引入版本冲突,不如方案1稳定。
方案3:升级Sonar组件(长期解决方案)
SonarQube 6.7.1是2018年的老版本了,后续的SonarQube LTS版本(比如7.9.x、8.9.x)已经支持Java 11,对应的sonar-maven-plugin也更新了依赖,不再依赖已被移除的JAXB模块。如果你的项目允许,建议:
- 升级SonarQube到支持Java 9+的版本(记得升级前备份数据)
- 同步把
sonar-maven-plugin升级到兼容的版本(比如3.9.0及以上)
内容的提问来源于stack exchange,提问作者burtsevyg
相关产品推荐
相关产品推荐

