ツール  /  SonarQube

SonarQube — Maven プラグインによる実行・確認

Maven プロジェクトで sonar:sonar ゴールを使って SonarQube 解析を実行する方法を解説します。 pom.xml への設定追加から JaCoCo によるカバレッジ計測、Quality Gate の確認、解析後の対応まで Maven ユーザー向けにまとめます。

1. 前提条件

項目要件
Maven3.6 以上
JDKJDK 17 以上(SonarQube 10.x の要件)
SonarQubeSonarQube サーバー(Docker / ZIP 版で別途起動済みであること)
SonarQube トークンSonarQube UI でプロジェクト作成 + 解析用トークンを発行済みであること

2. pom.xml の設定

Maven の SonarQube プラグインは pom.xml に依存関係として記述するか、 コマンドラインから直接 mvn sonar:sonar として実行できます(pom.xml の記述は任意)。 ただし JaCoCo プラグインは pom.xml に設定が必要です。

JaCoCo プラグインの設定

XML — pom.xml(JaCoCo + SonarQube 設定)
<properties>
  <!-- SonarQube 接続設定(コマンドラインでの上書きも可)-->
  <sonar.projectKey>my-project</sonar.projectKey>
  <sonar.host.url>http://localhost:9000</sonar.host.url>
  <!-- JaCoCo レポートのパス -->
  <sonar.coverage.jacoco.xmlReportPaths>
    ${project.build.directory}/site/jacoco/jacoco.xml
  </sonar.coverage.jacoco.xmlReportPaths>
  <!-- 解析除外(自動生成コードなど)-->
  <sonar.exclusions>**/generated/**,**/dto/**</sonar.exclusions>
</properties>

<build>
  <plugins>
    <!-- JaCoCo:カバレッジ計測 -->
    <plugin>
      <groupId>org.jacoco</groupId>
      <artifactId>jacoco-maven-plugin</artifactId>
      <version>0.8.12</version>
      <executions>
        <execution>
          <id>prepare-agent</id>
          <goals><goal>prepare-agent</goal></goals>
        </execution>
        <execution>
          <id>report</id>
          <phase>verify</phase>
          <goals><goal>report</goal></goals>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>

settings.xml へのトークン設定(推奨)

トークンをコマンドラインに直接記述するとシェル履歴に残るリスクがあります。 ~/.m2/settings.xml に記述することでより安全に管理できます。

XML — ~/.m2/settings.xml
<settings>
  <pluginGroups>
    <pluginGroup>org.sonarsource.scanner.maven</pluginGroup>
  </pluginGroups>
  <profiles>
    <profile>
      <id>sonar</id>
      <activation><activeByDefault>true</activeByDefault></activation>
      <properties>
        <sonar.host.url>http://localhost:9000</sonar.host.url>
        <sonar.token>sqp_xxxxxxxxxxxxxxxx</sonar.token>
      </properties>
    </profile>
  </profiles>
</settings>
💡 CI 環境ではシークレット変数を使用
settings.xml にトークンを書く方法は個人環境向けです。 CI では SONAR_TOKEN 環境変数またはシークレット変数として設定し、 コマンドラインで -Dsonar.token=$SONAR_TOKEN として渡します。

3. 実行基準 — Quality Gate / Quality Profile

Quality Gate と Quality Profile の設定は SonarQube サーバー側(Web UI)で行います。 Maven プラグイン側では設定不要です。

デフォルト条件(Sonar way Gate)閾値
新規コードのバグ0 件
新規コードの脆弱性0 件
新規コードのセキュリティホットスポット100% レビュー済み
新規コードのカバレッジ80% 以上
新規コードの重複率3% 以下

4. 実行方法 — sonar:sonar ゴールの実行

標準的な実行(カバレッジあり)

bash
# テスト実行 + カバレッジ計測 + SonarQube 解析を一括実行
mvn clean verify sonar:sonar \
  -Dsonar.token=<発行したトークン>

settings.xml にトークンを設定している場合

bash
mvn clean verify sonar:sonar

マルチモジュールプロジェクトの場合

bash
# ルート pom.xml があるディレクトリで実行(サブモジュールも自動的に解析対象になる)
mvn clean verify sonar:sonar \
  -Dsonar.token=<発行したトークン> \
  -Dsonar.projectKey=my-multi-project
解析のみ実行(テストをスキップする場合)
mvn sonar:sonar -DskipTests -Dsonar.token=<トークン>
ただしカバレッジ情報は取得されません。カバレッジを含めたい場合は verify フェーズまで実行してください。

5. 実行後の確認

解析完了後、コンソールに以下のようなログが出力され、SonarQube の URL が表示されます。

Console Output
[INFO] ANALYSIS SUCCESSFUL, you can find the results at:
[INFO]   http://localhost:9000/dashboard?id=my-project
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS

URL からプロジェクト画面を開き、以下を確認します。

確認項目確認方法
Quality Gate ステータスプロジェクト概要に「Passed」/「Failed」が表示される。
Bugs / VulnerabilitiesIssues タブで深刻度・件数を確認する。
Security HotspotsSecurity Hotspots タブで未レビュー件数を確認する。
CoverageMeasures → Coverage でカバレッジ率を確認する。
DuplicationsMeasures → Duplications で重複率を確認する。

問題の深刻度

深刻度意味対応優先度
BLOCKER即時修正必須のバグ。最高
CRITICALセキュリティ・データ整合性に影響する重大問題。
MAJOR機能障害・パフォーマンス劣化を招く欠陥。
MINOR可読性・保守性の問題。
INFO参考情報。最低

6. 確認後の対応

  1. BLOCKER / CRITICAL を優先対処
    Issues 画面で深刻度フィルターを使い、優先度の高い問題から修正します。
  2. 誤検知のマーク
    意図的なコードや誤検知は「Won't Fix」または「False Positive」にマークし、理由をコメントします。
  3. Security Hotspots のレビュー
    各 Hotspot を確認し、問題なければ「Safe」に変更します。
  4. 修正後に再解析
    mvn clean verify sonar:sonar を再実行し、Quality Gate が Passed になることを確認します。

解析除外の設定

XML — pom.xml の properties に追加
<properties>
  <!-- 解析対象の除外 -->
  <sonar.exclusions>
    **/generated/**,**/vendor/**,**/*Test.java
  </sonar.exclusions>
  <!-- カバレッジ計測の除外 -->
  <sonar.coverage.exclusions>
    **/entity/**,**/dto/**,**/config/**
  </sonar.coverage.exclusions>
</properties>

7. CI/CD への組み込み(GitHub Actions)

YAML — .github/workflows/sonar.yml
name: SonarQube Analysis

on:
  push:
    branches: [ main, develop ]
  pull_request:
    branches: [ main ]

jobs:
  sonar:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0   # 差分解析のためフルクローンが必要

      - name: Set up JDK 21
        uses: actions/setup-java@v4
        with:
          java-version: '21'
          distribution: 'temurin'

      - name: Maven Verify + SonarQube Scan
        env:
          SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
          SONAR_HOST_URL: ${{ secrets.SONAR_HOST_URL }}   # 例: http://your-sonarqube-server:9000
        run: |
          mvn clean verify sonar:sonar \
            -Dsonar.token=$SONAR_TOKEN \
            -Dsonar.host.url=$SONAR_HOST_URL
💡 GitHub Secrets の設定
Repository → Settings → Secrets and variables → Actions から SONAR_TOKENSONAR_HOST_URL を登録してください。

8. まとめ

フェーズ内容ポイント
設定pom.xml に JaCoCo プラグインを追加sonar.* プロパティは settings.xml に記述が推奨。
実行基準SonarQube UI で Quality Gate / Profile 確認Maven 側からの設定は不要。
実行mvn clean verify sonar:sonarverify フェーズでカバレッジも同時生成。
確認コンソールの URL → SonarQube UI で確認BLOCKER / CRITICAL を最優先で対処。
CI 組み込みGitHub Actions 等でパイプラインに追加SONAR_TOKEN をシークレットで管理。