チェックスタイルとPMD


86

Java製品のビルドシステムに静的分析ツールを導入しています。Maven2を使用しているため、CheckstylePMDの統合は無料です。ただし、基本的なスタイルルールを適用するという点では、これら2つのツールの機能には大きな重複があるようです。

これらの両方を利用することには利点がありますか?1つが機能する場合、2つのツールを維持したくありません。いずれかを選択した場合、どちらを使用する必要がありますか。その理由は何ですか。

FindBugsの使用も計画しています。他に検討すべき静的分析ツールはありますか?

更新:コンセンサスは、PMDがCheckStyleよりも優先されるということのようです。両方を使用する確固たる理由はわかりません。また、2セットのルールファイルを維持したくないので、おそらくPMDのみを目指します。また、FindBugsを導入し、最終的にはMackerを導入してアーキテクチャルールを適用します。

回答:


71

あなたは間違いなくFindBugsを使うべきです。私の経験では、偽陽性率は非常に低く、それが報告する最も重要度の低い警告でさえ、ある程度対処する価値があります。

CheckstyleとPMDについては、スタイルのみに関係しているため、Checkstyleは使用しません。私の経験では、Checkstyleは完全に無関係なものをたくさん報告します。一方、PMDは疑わしいコーディング手法を指摘することもでき、その出力は一般により関連性が高く、有用です。


49
FindBugsの推奨事項を追加するための+1。ただし、あなたが独自の独特のスタイルを持つ一匹狼の開発者でない限り、Checkstyleに関するあなたの意見には強く反対します。チームの場合、ルールの一般的な合理的なサブセットに同意し、Checkstyleなどの自動ツールを使用してそれらを自動的に適用すると、すべての人が読み取り可能なコードになります。
ジョントブラー2011年

1
完璧ではありませんが、FindBugsは群を抜いて最高です。PMDとcheckstyleは、まったくの悪い習慣にあなたを向けます。どの警告が有効でどれが無効であるかをよく理解していない限り、絶対に避ける必要があります。
DPM 2012年

奇妙なことに、私はPMDとCheckstyleで正反対の経験をしました。PMDは、チェックスタイルまたはFindbugsが検出しなかったものである場合、誤検知を報告することがよくあります。しかし、7年は非常に重要です。
xenoterracide 2016年

38

どちらのソフトウェアも便利です。Checkstyleは、中括弧や名前付けなどのコーディングスタイルをチェックすることで、プログラミング中に役立ちます。単純なことですが、非常に多くあります。

PMDは、クラスの設計中などのより複雑なルールをチェックしたり、クローン関数を正しく実装するなどのより特別な問題をチェックしたりすることで役立ちます。簡単に言えば、PMDはあなたのプログラミングスタイルをチェックします

ただし、どちらのソフトウェアも同様のルールに悩まされていることがあります。設定が悪いと、「役に立たないコンストラクターを削除する」と「常に1つのコンストラクター」という2回または2つの反対のことをチェックする可能性があります。


10
丁度。私見ですが、これらは異なることを目的とした2つのツールなので、比較できるかどうかはわかりません。開発チーム間で標準のコーディングスタイルを適用する場合は、Checkstyleを使用します。設計上の問題や不適切なコーディング慣行についてコードを分析する場合は、PMDを使用してください。
aberrant80

24

いずれかを選択した場合、どちらを使用する必要がありますか。その理由は何ですか。

これらのツールは競合していませんが、補完的であり、同時に使用する必要があります。

コンベンションタイプ(Checkstyle)は、一貫性のないコードを理解するために時間とエネルギーを費やす代わりに、人々が協力して創造性を解放できるようにする接着剤です。

Checkstyleの例:

  • パブリックメソッドにjavadocはありますか?
  • プロジェクトはSunの命名規則に従っていますか?
  • コードは一貫した形式で書かれていますか?

PMDはあなたに悪い習慣を思い出させますが:

  • 何もせずに例外をキャッチする
  • デッドコードがある
  • 複雑なメソッドが多すぎます
  • インターフェイスの代わりに実装を直接使用する
  • not equals(Object object)メソッドなしでhashcode()メソッドを実装する

ソース:http//www.sonarsource.org/what-makes-checkstyle-pmd-findbugs-and-macker-complementary/


1
Checkstyleは、コード形式に重点を置き、開発者に「コード標準」に従うように強制することに同意しますが、多くの悪い慣行を検出する可能性もあります。こちらをご覧ください。Checkstyleの拡張は、開発がより簡単ですが、同意します。制限があり、PMDとFindBugを克服することは決してありません。
ローマンイワノフ

15

私たちは両方を使用します:

  • チームの全員が同じような方法でコードを書くことを確認するためのCheckstyle
  • 問題のあるコード領域と次のリファクタリングターゲットを見つけるためのPMD


7

Checkstyle、PMD、Findbugsのルールリストを確認すると、3つすべてが価値のある出力を提供し、3つすべてがある程度重複し、独自の独自のルールをテーブルにもたらすことがわかりました。これが、Sonarのようなツールが3つすべてを使用する理由です。

とは言うものの、Findbugsには最も具体的またはニッチなルール(「IllegalMonitorStateExceptionの疑わしいキャッチ-どのくらいの頻度でそれに遭遇する可能性がありますか?」など)があるため、設定をほとんどまたはまったく行わずに使用でき、警告を真剣に受け止める必要があります。CheckstyleとPMDを使用すると、ルールはより一般的でスタイルに関連するため、カスタム構成ファイルでのみ使用して、チームを無関係なフィードバックの雪崩から保護する必要があります(「5行目のタブ文字」、「6行目のタブ文字」、 「7行目のタブ文字」...画像が表示されます)。また、Checkstyle DescendentTokenルールなど、独自の高度なルールを作成するための強力なツールも提供します。

3つすべてを使用する場合(特にSonarなどのツールで)、重複を防ぐように注意しながら、すべてを個別に構成する必要があります(すべてのルールをカバーするのに少なくとも数日かかります)(3つのツールすべてがhashCode()がたとえば、オーバーライドされ、equals()ではありません)。

要約すると、静的コード分析が価値があると考える場合、3つのいずれかの値を拒否することは意味がありませんが、3つすべてを使用するには、使用可能なフィードバックを提供するように構成するために時間を費やす必要があります。


6

Sonar(http://www.sonarsource.org/)は、コード品質を管理するための非常に便利なオープンプラットフォームであり、Checkstyle、PMD、Findbugsなどが含まれています。

これは、3つのツールすべてに存在する権利があることも示しています...


5

どちらのツールも構成可能であり、ほぼ同じことを実行できます。とは言うものの、すぐに使えるものについて話している場合、かなりの重複がありますが、明確なルール/チェックもあります。たとえば、Checkstyleは、Javadocのチェックとマジックナンバーの検索をより強力にサポートしています。さらに、Checkstyleには、Mackerの機能に似た「インポート制御」機能があります(私はMackerを使用していません)。

Checkstyleがすぐに実行でき、PMDが実行できない重要なことがある場合は、それらのチェックのみを使用した最小限のCheckstyle構成を検討することをお勧めします。次に、Checkstyle構成を拡張できないポリシーを設定します。たとえば、カスタムPMDルールを使用して同様の機能を実装する場合は、チェックを削除するだけです。

また、Checkstyleの「インポート制御」機能がMackerに必要なものをカバーしていると判断した場合は、PMD / Mackerの代わりにPMD / Checkstyleを実装できることも考慮してください。いずれにせよ、これは2つのツールですが、Checkstyleを使用すると、PMDがすぐに実行できない機能を「無料で」入手できます。


5

CheckstyleとPMDはどちらもコーディング標準のチェックに優れており、簡単に拡張できます。ただし、PMDには、循環的複雑度、Npathの複雑度などをチェックするための追加のルールがあり、正常なコードを記述できます。

PMDを使用するもう1つの利点は、CPD(Copy / Paste Detector)です。プロジェクト間でのコードの重複を検出し、JAVAに制限されません。JSPでも機能します。Neal Fordは、メトリクス駆動型アジャイル開発に関する優れたプレゼンテーションを行っています。これは、Java / JavaEE開発に役立つ多くのツールについて説明しています。


4
誰のために誰がこの...のCheckstyleは、今持っている読み込みこれらcheckstyle.sourceforge.net/config_metrics.html checkstyle.sourceforge.net/config_duplicates.html
smp7d

4

CheckstyleとPMDは、スタイルの問題と単純な明らかなコーディングのバグを強制するのに最適だと思います。私はEclipseとすべての警告を使用するのが好きだとわかりましたが、その目的にはEclipseの方が適しています。共有設定を使用し、実際のエラーとしてマークすることで、内容を強制します。そうすれば、そもそもチェックインされることはありません。

私が強くそして熱心に推奨するのは、FindBugsを使用することです。バイトコードレベルで動作するため、ソースレベルでは不可能なことをチェックできます。ジャンクのかなりの部分を吐き出しますが、コードに実際の重要なバグがたくさん見つかりました。


4

そして10年後... 2018年に私はそれらすべてをCheckstyle、PMD、FindBugsで使用しています。

FindBugsから始めましょうます。後でPMDとCheckstyleを追加するかもしれません。

デフォルトのルールをやみくもに強制しないでください

手順:

  • コードが多いプロジェクトでデフォルトのルールを使用して1つのツールを実行する
  • ルールをこのプロジェクトに適合させ、役に立たないルールをいくつかのメモでコメントアウトします
  • ぶら下がっているフルーツのルール(NPE、ロガーチェック、クローズされていないリソースチェックなど)に焦点を当てます。
  • 価値があると思われるルールに対していくつかの修正を実行します(一度に1つずつ!)
  • ツールごとにこれを行いますが、一度にすべてではありません!
  • このプロセスを繰り返します

理想的には、各プロジェクトに個別のルールを設定できます。ビルド(mavenプラグイン)を介してルールを実行するのが好きで、プロジェクトが定義したすべてのルールに合格することがわかったら、ルールエラーで失敗します。これにより、レポートだけでは不十分なため、開発者はアクションを実行する必要があります。その時点から、プロジェクトはほとんど防弾になり、後でルールを追加したり、カスタムルールを作成したりすることもできます。


参考までにSpotBugsは「FindBugsの精神的な後継者」であり、SpotBugsのドキュメントはかなり優れています。私の知る限り、FindBugsは何年も更新されていません。
skomisa

SpotBugsのことは聞いたことがありません。おそらく、FindBugs + fbcontribで十分だったため、代替品があることを知っておくとよいでしょう
Christophe Roussy

ここでそれについていくつかの議論があります:news.ycombinator.com/item?id
ChristopheRoussy18年

ツールは設定可能な感度を持つ傾向があることにも注意してください。たとえば、FindBugs / SpotBugsを使い始めるときは、最も深刻なバグのみをキャッチするために高しきい値を選択し、問題が修正されたらしきい値を下げる必要がある場合があります。
ThrawnCA 2018年

@ThrawnCAはい、ただし感度は高くなります。大規模なプロジェクトでは、妥当な時間内に修正されるエラーが多すぎることがわかります。したがって、代わりに私が行うことは、一度に1つのルールを追加し、潜在的なNP検出などの最も低い成果から始めて、閉じられていないリソースなどのルールに移ることです。
Christophe Roussy 2018年

3

私がこれまで見たことがない1つのポイントは、コードにCheckStyleルールセットを適用するIDEのプラグインがあるのに対し、PMDプラグインは違反についてのみ報告するということです。たとえば、複数のプログラミングチームにまたがるマルチサイトプロジェクトでは、標準について報告するだけでなく、標準を積極的に実施することが重要です。

どちらのツールにも、IntelliJ、NetBeans、およびEclipseで使用できるプラグインがあります(私の見解では、これはほとんどの使用法をカバーしています)。私はNetBeansにあまり詳しくないので、IntelliJとEclipseについてのみコメントできます。

とにかく、IntelliJおよびEclipse用のPMDプラグインは、プロジェクトコードベース内のPMD違反についてオンデマンドでレポートを生成します。

一方、CheckStyleプラグインはその場で違反を強調表示し、いくつかの問題を自動的に変換するように構成できます(少なくとも、IntelliJの場合、Eclipseの経験は少ないです)(たとえば、「OneStatementPerLine」の場合、CR-LFを配置します) 'NeedBraces'の場合​​、ステートメント間では、欠落している場所に中括弧が追加されます。明らかに、より単純な違反のみが自動的に修正されますが、それでもレガシープロジェクト、または複数の場所にあるプロジェクトでは役立ちます。

PMDの「オンデマンド」とは、開発者が意識的にレポートを実行することを決定する必要があることを意味します。一方、Checkstyle違反は、発生時に自動的に報告されます。PMDにより広範なルールセット含まれていますが、私の考えでは、IDEでの違反の自動実行/報告は、2セットのルールを維持する手間をかける価値があります。

だから私たちは両方のツールを使用して、上で動作するすべてのプロジェクトのために、Checkstyleは、IDEで施行、PMDはIDEで報告され、両方がビルドで(ジェンキンス経由)に報告して測定しました。


1
それをビルドに統合し、違反時に失敗させる方法もあります(たとえば、Mavenを使用)。Checkstyle、PMD、FindBugsでこれを行いました。あなたが言ったように、報告は十分ではありません。
Christophe Roussy 2018

3

見てくださいquliceを-のMavenプラグイン、一緒にそのコンバインのCheckstyle、PMD、FindBugsのといくつかの他の静的アナライザ、および事前に設定し、それらを。この組み合わせの利点は、すべてのプロジェクトで個別に構成する必要がないことです。

<plugin>
  <groupId>com.qulice</groupId>
  <artifactId>qulice-maven-plugin</artifactId>
  <version>0.15</version>
  <executions>
    <execution>
      <goals>
        <goal>check</goal>
      </goals>
    </execution>
  </executions>
</plugin>

レポートを(使用可能な形式で)取得するように構成するにはどうすればよいですか?これで、log4jを構成しても、コンソールにのみ吐き出されます。関連する可能性のあるバグレポートがあるようですが、よくわかりません。
アダムアロルド2016年

私たちは同じことを考えていますが、それを修正するには、コードまたは同様のもので強調表示する必要があります。少なくともあなたsettings.jarは助けました。
Adam Arold 2016年

2

PMDはJavaスタイル/コンベンションチェック用の最新の製品であるというコメントをエコーし​​ます。FindBugsに関しては、多くの商用開発グループがCoverityを使用しています。


1

PMDは、私がより多くの人が言及しているものです。Checkstyleは、4年前に人々が言及していたものでしたが、PMDはより継続的に維持され、他のIDE /プラグインが使用することを選択したと思います。


2
2008年には真実でしたが、今日、Checkstyleはかなりのスピードを上げています。
barfuin 2015

1

CheckstyleとPMDを使い始めたばかりです。私にとって、PMDは、System.gc()、Runtime.gc()が存在するかどうかなど、XPathクエリを記述できる限り、カスタマイズされたルールを作成する方が簡単です。これもまったく難しくありません。ただし、PMDは、列番号を表示する機能があることを示していません。したがって、列の制限を確認するなどの場合。Checkstyleを使用することをお勧めします。


-2

PMDは、checkstylesと比較した場合に最も優れたツールです。PMDが多くの機能を提供している間、Checkstylesにはコードを分析する機能がない場合があります。Offcourse PMDは、javadoc、コメント、インデントなどのルールをリリースしていません。ちなみに、これらのルールを実装する予定です.......ありがとうございます


checkstyleの良い点の1つは、RegexpSinglelineのような柔軟なルールを許可することです...– Jigar
Shah
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.