本ページはプロモーションが含まれています

Java入門

【2026年版】Java PMD導入ガイド|Maven/Gradle設定を解説

CATEGORY
REV.
DRAWN BY
TOM
SHEETS
9枚
PMD(Maven・Gradleでの導入)

トム

SESで約8年、環境を変えられないもどかしさの中にいました。32歳で自社開発企業に転職し、今はClaude Codeと自動化で、仕事も時間も組み直している途中です。
・Javaバックエンドエンジニア(Java歴12年以上)
・資格:基本情報技術者/応用情報技術者/Java Silver/Python3エンジニア認定基礎
詳細なプロフィール

𝕏

PMDとは、Javaのソースコードを実行せずに調べて、未使用の変数や空のcatchブロックといった「レビューで指摘されがちなミス」を見つける静的解析ツールです。Mavenならpom.xmlにmaven-pmd-pluginを、Gradleならbuild.gradleに id 'pmd' を足せば、ビルドのたびに自動で検出できます。

設定は2026年9月時点のPMD 7.27.0・maven-pmd-plugin 3.28.0・Gradle 9.7.1をもとにしています。警告の抑制や定着のコツ、Checkstyle・SpotBugsとの違いも、Java歴12年の現場経験をふまえてまとめました。

この記事でわかること

  • Maven・Gradleそれぞれへの具体的な導入手順
  • 自分のプロジェクトに合わせたruleset.xmlのカスタマイズ方法
  • 警告の抑制・除外と、ruleset.xmlをMaven・Gradleに読み込ませる方法
  • CIに組み込んで警告を放置させない運用のコツ

こんな方におすすめ

  • コードレビューで同じ指摘を何度も受けている人
  • Maven・GradleにPMDを導入する具体的な手順を知りたい人
  • PMDのルールをプロジェクトに合わせてカスタマイズしたい人

PARTS LIST /目次

PMDとは?Javaの静的解析ツールの基本と特徴

PMDとは、Java・Apexを中心に計18言語に対応したオープンソースの静的解析ツールです。プログラムを実行せずにソースコードをスキャンし、潜在的なバグや不適切な記述を検出します。

3つの静的解析ツールとCI/CDでの流れ
SOURCE / ソースコード構造PMD設計上の不備を検出
STYLE / 見た目Checkstyleインデント・命名規則
BYTECODE / バイトコードSpotBugs深刻なバグを検出
1
CI/CDMaven / Gradle で実行
2
レポート出力HTML / XML
3
コードレビュー自動で指摘が出る
NOTE3つは得意領域が重ならないため、組み合わせて使うのが一般的です。

静的解析とは「実行せずにバグの芽を摘む」技術

静的解析は、プログラムを動かさずにソースコードそのものを解析する手法です。テストコードを書いて実行する動的テストとは異なり、コンパイル前の段階で問題を発見できるのが最大の強み。タイピングミスに近い論理エラーや、将来的に保守性を下げる複雑な構造を、コードを書いた直後に把握できます。

PMDが見つける問題の種類(バグ・設計・可読性)

PMDが検出する問題は、大きく次の3種類です。

  • バグの予備軍:未使用の変数、空のcatchブロックなど
  • 設計上の問題:ネストが深すぎる条件分岐、長すぎるメソッドなど
  • 可読性の問題:命名規則違反など、書き手の癖が出やすい記述

まず押さえておきたいのは、UnusedPrivateField(未使用フィールドの検出)とCloseResource(リソースのクローズ漏れの検出)です。後者は、ConnectionやInputStreamのようにクローズが必要なリソースが閉じられていないコードを指摘してくれるため、リソースリークの予防に役立ちます。

NullPointerExceptionの多くは、「nullチェックを書き忘れる」という単純なミスが原因です。Optionalの使い方を覚えるだけでも防げるケースは少なくありません。PMDはこうした単純な見落としの一部を機械的に指摘してくれるため、経験の浅いうちほど効果を実感しやすいツールです。

Checkstyle・SpotBugsとの違いは?

Javaの解析ツールには他にCheckstyleやSpotBugsがありますが、それぞれ得意領域が異なります。Checkstyleは主に「コードの見た目(インデントや改行)」を整えます。SpotBugsは「バイトコードを解析して深刻なバグ」を探すツールです(FindBugsの後継ツール)。

PMDは「ソースコードの構造」から設計上の不備を見つける立ち位置です。3つのツールは役割が重ならないため、3つを組み合わせて使うのが一般的です。

あわせて読む
あわせて読む

PMDを導入するメリット3つ【コードレビューが変わる】

ツールを導入する最大のメリットは、開発者の「脳のリソース」を解放できる点にあります。機械に任せられるチェックはすべて任せ、人間は設計や仕様の検討に集中できます。

レビュー前に指摘が減るコードになる

PMDを導入すると、プルリクエストを出す前に自分自身で問題を修正する習慣がつきます。これまではレビューで「未使用のインポートがあります」と指摘されて恥ずかしい思いをしていた場面でも、PMDが事前に警告を出してくれます。指摘の総数が減るため、レビューの往復が減り、マージまでの時間が短くなります。

たとえば「このメソッド名では何をするのかわからない」とレビューで指摘されるケースはよくあります。doProcess()のような曖昧な名前をapplyDiscountIfEligible()のように処理内容が伝わる名前へ変えるだけで、説明のコメントが不要になります。命名は設計そのものです。PMDのcodestyleカテゴリーには命名規則に関するルールも含まれています。命名の指摘を機械的に受けられるようにしておくと、同種の指摘を未然に防げます。

あわせて読む

チーム開発で「暗黙のルール」を自動化できる

チーム独自の規約を口頭やドキュメントで伝えるのは限界があります。PMDのルールセットを設定しておけば、それがそのまま「チームの正解」として機能します。新しく入ったメンバーも、ツールが吐き出す警告に従うだけでチームの基準に沿ったコードが書けるようになるため、教育コストの削減にもつながります。

初心者がやりがちなミスを早期に防げる

Javaに慣れていない開発者が陥りやすい罠を、PMDは的確に指摘します。例えば、Stringの比較に「==」を使ってしまうようなミスや、リソースのクローズ漏れなどは、経験が浅いうちは気づきにくいものです。PMDがリアルタイムで教えてくれる環境は、初心者にとって実践的な学習教材になります。

PMDの導入手順【Maven・Gradle対応】

導入は意外と簡単で、既存のビルドツールに数行追加するだけで完了します。2026年9月時点のJavaプロジェクトであればMavenかGradleを使っているはずですので、それぞれの設定方法を見ていきましょう。

あわせて読む

PMDとJavaのバージョン対応表(17/21/25)

PMDを導入する前に、プロジェクトのJavaバージョンに対応したPMDバージョンを選ぶ必要があります。バージョンが合っていないと解析エラーが出るため、プロジェクトのJDKバージョンに合わせて選定しましょう。

バージョンリリース時期備考
PMD 7.27.02026年8月28日この記事の前提。Java 17/21/25はもちろん、Java 27まで解析できる
PMD 6.x系(最終版6.55.0)2023年2月開発終了。Java 20まで(Java 17対応は6.37.0から追加)
maven-pmd-plugin 3.28.02025年10月この記事の前提。PMD 7.17.0を同梱(依存関係の上書きで7.27.0に更新できる)
maven-pmd-plugin 3.21.02023年5月旧版。PMD 6.55.0を同梱
Gradle 9.7.1のpmdプラグイン2026年8月PMD 7.24.0まで動作確認済み

MavenプロジェクトにPMDを導入する方法

Mavenの場合は、pom.xmlのpluginsセクションにmaven-pmd-pluginを追加します。

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-pmd-plugin</artifactId>
    <version>3.28.0</version>
    <configuration>
        <sourceEncoding>UTF-8</sourceEncoding>
        <minimumTokens>100</minimumTokens>
        <targetJdk>17</targetJdk>
    </configuration>
    <executions>
        <execution>
            <goals>
                <goal>check</goal>
                <goal>cpd-check</goal>
            </goals>
        </execution>
    </executions>
</plugin>

これで mvn verify などのビルド時に自動で解析が走ります。上記はmaven-pmd-plugin 3.28.0(2025年10月リリース)の設定で、同梱されているPMDは7.17.0です。新しい版を使う場合は、Maven Centralで版を確かめて<version>を置き換えてください。

同梱の7.17.0より新しいPMD(この記事では7.27.0)を使いたい場合は、プラグインの依存関係を上書きします。手順はMaven公式ドキュメントのとおりです。pmd-core・pmd-java・pmd-javascript・pmd-jspの4つは、同じバージョンにそろえてください。

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-pmd-plugin</artifactId>
    <version>3.28.0</version>
    <dependencies>
        <dependency>
            <groupId>net.sourceforge.pmd</groupId>
            <artifactId>pmd-core</artifactId>
            <version>7.27.0</version>
        </dependency>
        <dependency>
            <groupId>net.sourceforge.pmd</groupId>
            <artifactId>pmd-java</artifactId>
            <version>7.27.0</version>
        </dependency>
        <dependency>
            <groupId>net.sourceforge.pmd</groupId>
            <artifactId>pmd-javascript</artifactId>
            <version>7.27.0</version>
        </dependency>
        <dependency>
            <groupId>net.sourceforge.pmd</groupId>
            <artifactId>pmd-jsp</artifactId>
            <version>7.27.0</version>
        </dependency>
    </dependencies>
</plugin>

旧版の3.21.0(PMD 6.55.0同梱)を使い続けると、Java 21以降の構文を正しく解析できません。既存のpom.xmlに古いバージョンが残っていないか確認しておきましょう。

GradleプロジェクトにPMDを導入する方法

Gradleの場合は、さらに記述がシンプルになります。build.gradleにpmdプラグインを適用するだけです。

plugins {
    id 'pmd'
}

pmd {
    consoleOutput = true
    toolVersion = "7.24.0"
    ruleSets = ["category/java/errorprone.xml", "category/java/bestpractices.xml"]
}

組み込みのルールセットを指定するだけで解析が始まります。toolVersion には、Gradle 9.7.1が動作確認済みとしている上限の PMD 7.24.0 を指定しました。

Gradle 9.7.1が動作確認済みとしている7.24.0より新しいPMD(7.25.0以降)を指定する場合は、事前に手元で動作を確かめてください。プロパティ名は ruleSets(Sが大文字)です。rulesets と書くとunknown propertyエラーでビルドが止まるので注意しましょう。category/java/〜.xml という指定形式はPMD 7でもそのまま使えます。

PMDの実行コマンドとレポートの確認方法

設定が終わったら、コマンドラインから解析を実行してみましょう。Mavenなら mvn pmd:pmd、Gradleなら ./gradlew pmdMain を実行します。解析が終わると、HTML形式やXML形式でレポートが出力されます。ブラウザでレポートを開けば、どのファイルの何行目にどんな問題があるか一目瞭然です。

目的別に使い分けるコマンドは次のとおりです。

コマンド用途
mvn pmd:pmd解析してレポートを出力するだけ(ビルドは止まらない)
mvn pmd:check違反があればビルドを失敗させる(CI向け)
./gradlew pmdMainmainソースセットだけを解析する
./gradlew checkテストと一緒にPMD(pmdMain・pmdTest)も実行する

コピペコードを検出するCPD(cpd-check)

PMDにはCPD(Copy/Paste Detector)という重複コード検出機能が付属しています。冒頭のpom.xmlに書いた cpd-check ゴールがこれです。

minimumTokens は、何トークン以上の一致を重複とみなすかのしきい値です。初期値は100で、コードにするとおよそ5〜10行に相当します。mvn pmd:cpd-check は重複が見つかるとビルドを失敗させるため、CIに入れる場合は警告と同じく段階的に導入しましょう。

ビルドツールなしでPMDをCLI実行する方法

ビルドツールを導入していない小規模なスクリプトや、ビルド前の簡易チェックだけを行いたい場合は、PMD単体をCLIから実行できます。PMD公式サイトから配布zip(この記事では pmd-dist-7.27.0-bin.zip)をダウンロードして展開すれば、インストール完了です。実行にはJava 8以上が必要です。

pmd check -d <ソースディレクトリ> -R rulesets/java/quickstart.xml -f text
オプション指定内容
-d解析対象のディレクトリ
-Rルールセット
-fレポート形式

Maven・Gradleのプラグイン経由と異なり、ビルド設定ファイルを触らずに素早く試せるため、既存プロジェクトへの導入前の検証にも向いています。

IDEでPMDを使う方法【IntelliJ/Eclipse/VS Code】

ビルドツール経由だけでなく、IDEのプラグインを使えばコーディング中にリアルタイムで警告を確認できます。

IDE導入方法
IntelliJ IDEASettings > Pluginsから「PMD Plugin」をインストールし、右クリックメニューから解析を実行
EclipseMarketplaceから「PMD Eclipse Plugin」を導入すれば、保存時に自動で解析が走る
VS Code拡張機能「PMD」をインストールすることで、エディタ上に警告がインライン表示される

IDE連携を入れておくと、ビルドを待たずに問題を修正できるため、開発のテンポが上がります。

PMDの警告(Violation)の読み方と対処法

ツールを導入した直後は、大量の警告が出てきて圧倒されるかもしれません。しかし、すべての警告に等しく対応する必要はありません。直すべき警告とそうでない警告を選り分ければ十分です。

よく出る警告の意味と対処の考え方

よく目にする警告には、一定のパターンがあります。「UnusedPrivateField(未使用のフィールド)」や「EmptyCatchBlock(空の例外処理)」は、見つけ次第直す典型例です。放置してもメリットは一つもありません。警告の内容を翻訳ツールなどで確認し、コードの意図と照らし合わせて修正案を練りましょう。

実務でのコツは、PMDの警告メッセージにそのまま表示されるルール名(例: AvoidReassigningParameters)を使うことです。そのルール名でPMD公式ドキュメントを検索すると、なぜNGなのか・どう直すべきかの具体例がすぐに見つかります。英語が苦手でも、コード例を見れば意図は把握できます。

「直すべき警告」と「無視していい警告」の見分け方

すべてのルールが自分のプロジェクトに合うとは限りません。例えば、変数の命名規則に関する警告が出ていても、既存のコードベースと整合性を取るためにあえて無視する判断も必要です。バグに直結するものは「必須」、読みやすさに関するものは「推奨」といった具合に、自分なりの優先順位を持って向き合うのがコツです。

警告を個別に抑制・除外する方法(@SuppressWarnings・NOPMD)

直さないと決めた警告は、ルールを丸ごとオフにする前に、該当箇所だけ抑制できないかを考えます。クラスやメソッド単位なら @SuppressWarnings("PMD.ルール名")、1行だけなら // NOPMD コメントが使えます。

// ルール単位で抑制する(理由をコメントに残す)
@SuppressWarnings("PMD.AvoidReassigningParameters")
public String normalize(String name) {
    name = name.trim();
    return name;
}

// 1行だけ抑制する
int unused = calc(); // NOPMD 副作用のため戻り値は使わない

自動生成コードのように、ファイルごと解析から外したい場合はビルド設定で除外します。Mavenは excludes に、Gradleは Pmd タスクの exclude にパターンを指定します。

<configuration>
    <excludes>
        <exclude>**/generated/**</exclude>
    </excludes>
</configuration>
tasks.withType(Pmd).configureEach {
    exclude '**/generated/**'
}

抑制は「なぜ直さないのか」をコメントで残しておくと、後から見直すときに判断できます。

警告を放置すると何が問題になるのか

重要度の低い警告でも、放置し続けるのは危険です。警告があふれる状態に慣れると、本当に深刻なバグの予兆を見逃す「警告慣れ」が起きます。直さないと決めたものはルール設定でオフにするか、個別に抑制コメントを入れて、常に「警告ゼロ」の状態を維持するのが健全な運用の鉄則です。

ルールセットのカスタマイズ方法【ruleset.xml】

デフォルト設定は、あくまで汎用的なものです。現場の状況に合わせてルールをカスタマイズすることで、PMDは初めて「使えるツール」に進化します。

デフォルトルールをそのまま使うと起きがちな問題

PMDの標準ルールをすべて有効にすると、あまりの厳しさに開発がストップしてしまいます。例えば「メソッドの長さは10行以内」といった極端なルールに縛られると、かえってコードが断片化して読みづらくなるケースもあります。デフォルトはあくまで参考程度に考え、自分たちに合った形に絞り込んでいく作業が必要です。

ルールの8カテゴリーと優先度(Priority)

PMDのルールは以下の8カテゴリーに分類されています。

カテゴリー内容
errorproneエラー予備軍
bestpractices推奨プラクティス
design設計
performance性能
codestyleコードスタイル
documentationドキュメント
securityセキュリティ
multithreading並行処理

各ルールには Priority 1(最重要)〜5(軽微)の優先度が設定されています。rulesMinimumPriority 等でしきい値を指定すれば、重要なルールだけに絞って有効化できます。

Gradleは rulesMinimumPriority の1本で済みますが、Mavenは minimumPriority(評価するルールの絞り込み)と failurePriority(ビルドを失敗させる基準)が別のパラメータです。「警告は全部見せるが、止めるのは重要なものだけ」という設定もできます。

実務では、次のように段階的にルールを採用するのが現実的です。

  1. errorprone・security・multithreading のPriority 1〜2だけを有効にし、バグに直結する項目のみをチェックする
  2. チームが慣れてきたら bestpractices・design を追加する
  3. 最後に好みの分かれやすい codestyle を検討する

ruleset.xmlの書き方|ルールの除外と絞り込み

プロジェクト独自のruleset.xmlを作成し、必要なルールだけをピックアップしましょう。

<ruleset name="Custom Rules"
    xmlns="http://pmd.sourceforge.net/ruleset/2.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://pmd.sourceforge.net/ruleset/2.0.0 https://pmd.sourceforge.io/ruleset_2_0_0.xsd">

    <description>My project rules</description>

    <rule ref="category/java/errorprone.xml">
        <exclude name="NonSerializableClass" />
    </rule>
</ruleset>

特定のルールを除外(exclude)するだけで、ノイズを大幅に減らせます。ruleset.xmlの基本構造はPMD 7.xでも同じです。

ただし、一部のルールは名前が変わっています。たとえば旧名の BeanMembersShouldSerialize はPMD 6.52.0で NonSerializableClass に改名されました。PMD 7では旧名を使えません。PMD 6時代のruleset.xmlを流用する場合は、公式のルール一覧でルール名を照合してください。

作成したruleset.xmlをMaven・Gradleに読み込ませる方法

ruleset.xmlを作っただけでは解析に使われません。ビルドツール側に置き場所を教える必要があります。ここでは config/pmd/ruleset.xml に置いた場合の設定を示します。

Mavenは rulesets にファイルパスを指定します。

<configuration>
    <rulesets>
        <ruleset>${project.basedir}/config/pmd/ruleset.xml</ruleset>
    </rulesets>
</configuration>

Gradleは ruleSetFiles で指定します。ruleSets の初期値には category/java/errorprone.xml が入っています。自作のruleset.xmlだけを使いたい場合は、空にしてください。

pmd {
    ruleSetFiles = files("config/pmd/ruleset.xml")
    ruleSets = []
}

ruleSets = [] を書き忘れると、自作のルールに加えてデフォルトのerrorproneカテゴリまで有効になります。除外したはずのルールでも警告が出続けます。

チームで合意を取りやすいルール調整の考え方

ルールの取捨選択は、一人で決めずにチームメンバーと話し合うのが理想的です。おすすめの進め方は、まず「絶対に譲れないバグルール」だけを有効にし、運用しながら徐々にルールを追加していくやり方です。最初からハードルを高くしすぎないことで、チーム内の反発を抑えつつ、スムーズに静的解析の文化を根付かせられます。

PMDを継続的に活用するための運用パターン

ツールは導入して終わりではありません。日常の開発フローに組み込み、ルールを見直し続けて初めて効果が出ます。導入からCIでの定着までは、次の4段階で進めるとスムーズです。

4段階で変わる設定と、違反が見つかったときのビルド
1
CLI・IDEプラグインまず試すビルド設定はまだ触らない。警告の傾向をつかむだけビルド:無関係
2
ローカルのビルドビルドに組み込むMaven:failOnViolation を false / Gradle:ignoreFailures = trueビルド:通る(レポートだけ出力)
3
ローカルのビルドルールを絞るruleset.xml で errorprone など重要なルールから有効にする(Gradle は ruleSets = [] も書く)ビルド:通る(まだ止めない)
4
CI(GitHub Actionsなど)CIで止めるMaven:failOnViolation を true / Gradle:ignoreFailures を外すビルド:違反があれば失敗(マージできない)
NOTE4の後も、絞ったルールを定期的に見直して3に戻ります。変更ファイルから警告ゼロを目指します。
  1. まず試す:CLI・IDEプラグインで警告の傾向をつかむ
  2. ビルドに組み込む:Mavenは failOnViolation を false、Gradleは ignoreFailures = true にして、レポート出力だけを行う
  3. ルールを絞る:ruleset.xmlで errorprone など重要なルールから有効にする
  4. CIで止める:failOnViolation を true(Gradleは ignoreFailures を外す)にして、変更ファイルから警告ゼロを目指す

CIに組み込んで「壊れたら止まる」仕組みを作る

GitHub ActionsなどのCI(継続的インテグレーション)ツールと連携させるのが、最も効果的な運用方法です。プルリクエストが作成された際に自動でPMDを実行し、警告がある場合はマージできないようにガードをかけます。警告時にマージをブロックすることで、汚れたコードがメインブランチに混入するのを物理的に防げます。

CI導入時の注意点
最初から全ルールを有効にしてCIを回すと大量の警告でビルドが通らなくなり、チームから反発が出がちです。最初は failOnViolation を false にしてレポート出力のみとし、チームが慣れたタイミングで true に切り替えるのが現実的な進め方です。

段階導入では、MavenとGradleで初期状態の挙動が違う点につまずきがちです。Mavenの mvn pmd:pmd はレポートを出すだけでビルドを止めませんが、check ゴールは違反があると失敗します。

Gradleは初期設定のまま ./gradlew check を実行すると、違反があった時点で失敗します。レポートだけ出したい導入初期は、pmd ブロックに ignoreFailures = true を指定してください。

既存コードが多い場合はどう導入する?

すでに巨大なコードベースがあるプロジェクトにPMDを入れると、数千件の警告が出ることも珍しくありません。それでも、一度にすべてを直そうとしてはいけません。

まずは「新規に作成・変更したファイルのみを対象にする」運用から始めましょう。ボーイスカウトのルールのように、触った場所から少しずつきれいにしていくのが、挫折しにくい進め方です。

PMDを形骸化させないための運用ルール

「警告が出ているけど忙しいから無視しよう」という空気が流れると、ツールは死にます。定期的にルールを見直す時間を設け、今の開発に合わなくなった古いルールは積極的に削除しましょう。ツールに使われるのではなく、自分たちが開発を楽にするためにツールを「使いこなしている」という意識をチームで共有しましょう。

PMDはどんな開発者・チームに向いているか

万能に見えるPMDですが、プロジェクトのフェーズや目的によっては、他の手段を選んだ方が良い場合もあります。適材適所を見極めましょう。

個人開発・小規模チームでの向き不向き

個人開発こそ、PMDを導入すべきだと私は断言します。自分一人だとどうしてもコードが自己流になりがちですが、PMDが客観的な視点を与えてくれます。一方で、プロトタイプを短期間で作るフェーズの超小規模チームでは、ルールの調整に時間を取られすぎて、かえって遅くなることがあります。速度と品質のバランスを考えましょう。

Java初心者がPMDを使うと得られる学習効果

初心者のエンジニアにとって、PMDは24時間つきっきりで教えてくれるメンターのような存在です。なぜこの書き方がダメなのか、警告メッセージを調べていく過程で、Javaの言語仕様やベストプラクティスへの理解が深まります。参考書を1冊読むよりも、PMDに怒られながらコードを修正する方が、ずっと身につきます。

PMDを使うべきでないケースと代替案

コードの「意味」や「文脈」に深く踏み込んだ解析を求めるなら、PMDだけでは不十分です。たとえば業務ロジックの矛盾や、複雑なデータフローのバグを見つけるのは苦手です。業務ロジックやデータフローの問題まで検出したい場合は、AIによるコードレビューツールや、より高度な商用解析ツールの導入を検討すべきです。PMDはあくまで「形式的な不備」を見つけるための基礎体力を養うツールと割り切りましょう。

ただし、AIレビューがあるからPMDは不要、とは考えていません。AIは同じコードでも指摘が揺れることがありますが、PMDは同じ入力なら毎回同じ結果を返します。

私は、CIで「通す・止める」を決める関門には再現性のあるPMDを置き、設計の相談にはAIを使う分担が合理的だと考えています。

トム
トム

ツールは一度決めたら固定、というわけでもないんですよね。

実際に、私自身も以前使っていたSpotBugsがしっくりこず、JetBrainsのQodanaに乗り換えました。決め手はツールのモダンな使い心地でした。静的解析ツールは「PMDだけで完結させる」のではなく、目的に応じて他ツールと組み合わせる、あるいは乗り換えを検討する柔軟さも必要だと感じています。

あわせて読む

PMDに関するよくある質問

Q1. PMDとは何ですか?

A1. PMDは、Java・Apexを中心に計18言語に対応したオープンソースの静的解析ツールです。プログラムを実行せずにソースコードをスキャンし、未使用の変数や空のcatchブロックなどの潜在的なバグ・設計上の問題を検出します。

Q2. PMDの導入に費用はかかりますか?

A2. いいえ、PMDはBSDライセンスの無料・オープンソースツールです。Maven・Gradleのプラグインとして数行の設定を追加するだけで、追加費用なく導入できます。

Q3. PMDとCheckstyle・SpotBugsの違いは何ですか?

A3. Checkstyleはコードの見た目(インデントや命名規則)、SpotBugsはバイトコード解析による深刻なバグ検出を得意とします。PMDはソースコードの構造から設計上の不備を見つける立ち位置で、3ツールを組み合わせて使うのが一般的です。

Q4. PMDはビルドを遅くしますか?

A4. 解析時間は、コード量と有効にしたルールの数に応じて増えます。Gradleではthreads設定で並列化でき、有効にするルールを絞ることでも実行時間を抑えられます。

Q5. 既存の大規模プロジェクトにPMDを後から導入できますか?

A5. できます。最初から全ルールを有効にすると大量の警告に圧倒されるため、「新規に作成・変更したファイルのみを対象にする」という運用から始めるのが現実的です。

Q6. maven-pmd-pluginとGradleのどちらが新しいバージョン対応?

A6. maven-pmd-plugin 3.28.0はPMD 7.17.0を同梱しており、依存関係を上書きすれば新しいPMD(この記事では7.27.0)も使えます。Gradle 9.7.1のPMDプラグインは動作確認済みのバージョンをPMD 7.24.0までとしており、7.25.0以降を使う場合は事前の動作検証が必要です。

Q7. PMDの警告を特定の箇所だけ無視するにはどうしますか?

A7. クラスやメソッド単位なら @SuppressWarnings("PMD.ルール名")、1行だけなら // NOPMD コメントで抑制できます。自動生成コードなどファイル単位で外す場合は、Mavenは excludes、Gradleは Pmd タスクの exclude にパターンを指定します。

Q8. PMDはJava 21や25に対応していますか?

A8. はい、対応しています。PMD 7系(この記事の前提は7.27.0)は、LTSのJava 17・21・25に加え、Java 27まで解析できます。PMD 6系は最終版6.55.0でJava 20までのため、Java 21以降のプロジェクトではPMD 7を使ってください。

まとめ:PMDは「コード品質を仕組みで守る」ための道具

PMDの本質は「意志の力に頼らない」ことにあります。どれほど優秀なエンジニアでも、深夜の作業や締め切り間際ではミスをします。そんなときでも、PMDは毎回同じ基準でコードをチェックしてくれます。

PMD導入で得られる本質的なメリット

PMDを使いこなすことで、私たちは「書き方の正解」に悩む時間を減らし、アプリケーションが提供する「価値」を考える時間に投資できるようになります。コードがきれいになるのは副産物に過ぎません。真のメリットは、チームに規律が生まれ、心理的安全性を保ちながら高速にデリバリーできる体制が整う点にあります。

まず最初にやるべきPMD活用アクション

まずは手元のプロジェクトにPMDのプラグインを追加し、デフォルト設定で解析を実行してみてください。出てきた警告の中から、1つだけでいいので「これは確かに直した方がいいな」と思えるものを見つけて修正しましょう。その小さな一歩が、将来の自分とチームを助ける大きな変化の始まりです。

この記事の内容は2026年9月時点の情報です。PMDやプラグインの最新版は、公式サイトで確認してください。

あわせて読む
REVISIONS / 改訂履歴
REV.DATE内容
62026-10-15図解を描き直し(図面のデザインにそろえた)
52026-10-14一人称と言い回しの表記をそろえた
42026-09-242026年9月時点の情報で全体を見直し(古い記述を2件更新)
32026-08-222026年8月時点の情報で全体を見直し(古い記述を6件更新)
… ほか1回の改訂
12026-02-06初版
NEXT READ本棚から1本

AIで開発を組み直すなら、まずこの5冊から

入門・実践・設計まで、Claude Codeの本をレベル別に5冊選んで比べました。

→ おすすめ5冊を見る

  • この記事を書いた人
  • 最新記事

トム

SESで約8年、環境を変えられないもどかしさの中にいました。32歳で自社開発企業に転職し、今はClaude Codeと自動化で、仕事も時間も組み直している途中です。
・Javaバックエンドエンジニア(Java歴12年以上)
・資格:基本情報技術者/応用情報技術者/Java Silver/Python3エンジニア認定基礎
詳細なプロフィール

𝕏

Java入門