19782


# やりたいこと

Javaによるコードクローン（重複コード）の発見をしたいと考えています。  
PMDは検出力が弱い様に感じましたので、他のお勧めなツールや検討に値するツールがありましたら教えてください。

CCFinder（<http://www.ccfinder.net/ccfinderxos-j.html>）も有名な様ですが、UIが直感的でない様に感じました。こちらの勘所もご存じの方いらっしゃいましたら、教えて頂けると幸いです。

# 背景

  * プロジェクトの規模は、1k人月～5k人月規模です。
  * Webアプリケーションの開発

* * *

コメントありがとうございます。  
たとえば検出したいコードの一例として下記の様なものがあります。  
（サンプルは同一クラス内のメソッドです）  
重複コードとしてばっちり下記を捕らえてくれないように思います。

[code]

    （略）
    public void code1() {
        String hoge = null;
        hoge.length();
        int[] a = {34, 21, 13, 8, 5, 3, 2, 1, 1, 0};
        System.out.println(a[0]);
    }
    
    public void code2() {
        String hoge = null;
        hoge.length();
        int[] b = {0, 1, 1, 2, 3, 5, 8, 13, 21, 34};
        System.out.println(b[9]);
    }
    （略）
    
[/code]


CC BY-SA 3.0
2015-12-01T01:38:09.100
19491
2015-12-09T09:15:02.787
2015-12-01T07:14:48.357
3355
3355
question
java
Javaによるコードクローン（重複コード）の発見ツールでおすすめなものありますか？


CI で使えない IDE の機能で恐縮なのですが，[IntelliJ IDEA
Ultimate](https://www.jetbrains.com/idea/download/) (有料)
に[重複コードの検出機能](https://www.jetbrains.com/idea/help/analyzing-
duplicates.html)があり，上記サンプルコードも検出できます。

[![画像の説明をここに入力](https://i.stack.imgur.com/BB8W0.png)](https://i.stack.imgur.com/BB8W0.png)

  * 使い方：メインメニュー Analyze > Locate Duplicates から実行します
  * 分析の単位は，全プロジェクトの全ファイルに可能です
  * 検出の粒度は，ローカル変数，フィールド，メソッド，型，リテラル（文字）をオプション選択することができます 
    * 上記サンプルコードの重複検出はリテラル (Anonymize Literals) オプションを有効にすると検出できます
  * 対応言語は，[Java 以外にも Javascript，HTML，CSS](https://www.jetbrains.com/idea/help/code-duplication-analysis-settings.html) 等があります

[![画像の説明をここに入力](https://i.stack.imgur.com/S5igM.png)](https://i.stack.imgur.com/S5igM.png)

  * IntelliJ IDEA 15 より，[コード記述中にリアルタイムで重複コードを検出&表示](http://blog.jetbrains.com/idea/2015/08/intellij-idea-15-eap-adds-on-the-fly-code-duplicates-detection/)してくれますので，コード品質担当者でない開発担当者も，開発中に重複コードに気付ける仕組みが最初からあります

    * 若干鬱陶しいぐらいリアルタイムで重複コードが検出されます…
  * 重複コード分析結果は HTML で出力可能です

    * 出力された HTML に文字コードの指定がないため，日本語が文字化けしてしまいます
    * <meta charset="UTF-8"> を出力された HTML のヘッダに追加すれば，文字化けが解消します

IntelliJ の回し者のようになってしまいましたが，重複検出が強力なのでおすすめします。


CC BY-SA 3.0
2015-12-09T03:19:39.793
19782
2015-12-09T09:15:02.787
2015-12-09T09:15:02.787
13583
13583
19491
answer