Computer

SonarQubeのMavenプラグインがXMLの解析に失敗する場合の対処方法

先日、Java+MavenのプロジェクトでSonarQubeを使ったコード解析が突然できなくなるという問題が発生し、一時的な対応をしたので、その内容をまとめておこうと思います。

症状とエラー

問題は、SonarQubeのMavenプラグインを実行してコード解析をした時に発生し、ビルドを実行すると以下のようなエラーが発生します。

[ERROR] Failed to execute goal org.sonarsource.scanner.maven:sonar-maven-plugin:3.6.0.1398:sonar (default-cli)
on project my-project: Could not analyze the file path/to/pom.xml:
java.lang.String cannot be cast to java.lang.Boolean -> [Help 1]


Caused by: org.apache.maven.plugin.MojoExecutionException: Could not analyze the file path/to/pom.xml
at org.sonarsource.scanner.maven.bootstrap.ScannerBootstrapper.execute (ScannerBootstrapper.java:67)
at org.sonarsource.scanner.maven.SonarQubeMojo.execute (SonarQubeMojo.java:104)

...(省略)...

Caused by: java.lang.IllegalStateException: Could not analyze the file path/to/pom.xml
at org.sonar.plugins.xml.XmlSensor.runChecks (XmlSensor.java:107)
at org.sonar.plugins.xml.XmlSensor.analyse (XmlSensor.java:84)

...(省略)...

Caused by: java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Boolean
at com.sun.org.apache.xerces.internal.impl.XMLEntityManager.reset (XMLEntityManager.java:1441)

...(省略)...

スタックトレースは省略していますが、見る限りpom.xmlのファイルの解析に失敗しています。Jenkinsでのビルドが失敗していたため、ローカルでも試してみると全く同じ問題が発生しました。以前はこんな問題ありませんでしたし、このpom.xmlは最近は全く更新していません。

原因

上でも書いた通り、このpom.xmlファイルは最近は全く更新されておらず、またXMLとしても問題がありません。

そこでDockerでSonarQubeを立ち上げて、このローカルのSonarQubeサーバーをビルドファイルに指定してビルドを行ったところ、全く同じコードなのにコード解析も含めたビルドに成功しました。

ローカル側がまったく同じで、あるサーバーでだけ問題が発生するので、サーバー側にあるプラグイン(解析用のモジュール)に問題がある模様です。

詳細はわからないのですが、どうもSonarQubeのMavenプラグインは、サーバー側からjarファイルやルールをダウンロードしてローカル側で実行している感じなのでサーバー側のプラグインのバージョンによって問題が発生する可能性は十分にあると思います。

対処方法

問題を発生するSonarQubeサーバーは社内のサーバーで、自分には管理権限がありません。そのため発生した問題を管理者に報告するべきなのででしょう。

ただこれは社内的な問題なのですが・・・この手のシステムで発生した問題に関しては対応が非常に遅いので、ここでは一時的な対処方法をとりました。

その方法とは、マスターのpom.xmlに以下のプロパティを追加して、XMLファイルの解析をさせないようにする方法です。

<properties>
    <sonar.exclusions>**/*.xml</sonar.exclusions>
</properties>

これにより、XMLファイルが全て無視されるのでとりあえず問題は回避できます。最初はpom.xmlだけを無視させたのですが、他のXMLファイルでも同様の問題が発生したので、面倒になりXMLをまとめて無視させています。

これは根本的な解決策ではありませんが、このプロジェクトではXMLを解析する必要をまったく感じていないのでこの方法をとりました。

このプロジェクトはJavaメインなので、もしこれがJavaの解析で発生したら、さすがにJavaファイルを全て無視させる訳にも行かないので根本的な対応を取る必要がありそうですね。

-Computer