web-dev-qa-db-ja.com

Javaプロジェクトで未使用/デッドコードを見つける方法

大規模なJavaプロジェクトで未使用/デッドコードを見つけるためにどのツールを使用しますか?当社の製品は数年間開発されており、使用されなくなったコードを手動で検出することは非常に難しくなっています。ただし、未使用のコードを可能な限り削除しようとします。

一般的な戦略/手法(特定のツール以外)の提案も歓迎します。

編集:コードカバレッジツール(Clover、IntelliJ)を既に使用していることに注意してください。しかし、これらはほとんど役に立ちません。デッドコードにはまだユニットテストがあり、カバーされているように表示されます。理想的なツールは、それに依存する他のコードがほとんどないコードのクラスターを識別し、ドキュメントの手動検査を可能にすると思います。

292
knatten

コードの使用状況のログを保持するように実行中のシステムをインスツルメントし、数か月または数年使用されていないコードの検査を開始します。

たとえば、未使用のクラスに興味がある場合、インスタンスが作成されたときにすべてのクラスがログに記録されるようにできます。そして、小さなスクリプトでこれらのログをクラスの完全なリストと比較して、未使用のクラスを見つけることができます。

もちろん、メソッドレベルで行う場合は、パフォーマンスに留意する必要があります。たとえば、メソッドは最初の使用のみを記録できます。これがJavaでどのように行われるのが最適かわかりません。これをSmalltalkで実行しました。Smalltalkは動的言語であるため、実行時にコードを変更できます。すべてのメソッドをロギングコールでインスツルメントし、メソッドが初めてログに記録された後にロギングコードをアンインストールします。したがって、しばらくするとパフォーマンスのペナルティは発生しません。 Javaで静的ブールフラグを使用して同様のことを行うことができます...

38
akuhn

適度に機能するEclipseプラグインは nused Code Detector です。

プロジェクト全体または特定のファイルを処理し、さまざまな未使用/デッドコードメソッドを表示するとともに、可視性の変更を提案します(つまり、保護またはプライベートにできるパブリックメソッド)。

219
Mikezx6r

CodePro はEclipseプロジェクトと共にGoogleによって最近リリースされました。無料で非常に効果的です。プラグインには、1つ/多くのエントリポイントを持つ ' Find Dead Code '機能があります。かなりうまくいきます。

64
Berlin Brown

驚きました ProGuard ここで言及されていません。これは、最も成熟した製品の1つです。

ProGuard は、無料のJavaクラスファイルシュリンク、オプティマイザー、難読化ツール、および事前検証ツールです。未使用のクラス、フィールド、メソッド、および属性を検出して削除します。バイトコードを最適化し、未使用の命令を削除します。意味のない短い名前を使用して、残りのクラス、フィールド、およびメソッドの名前を変更します。最後に、Java 6またはJava Micro Editionの処理済みコードを事前検証します。

ProGuardの用途は次のとおりです。

  • より小さなコードアーカイブ、より高速なネットワーク転送、より高速なロード、およびより小さなメモリフットプリントのための、よりコンパクトなコードの作成。
  • プログラムとライブラリをリバースエンジニアリングするのを難しくします。
  • デッドコードをリストするため、ソースコードから削除できます。
  • Java 6以上の既存のクラスファイルをリターゲティングおよび事前検証し、クラスの読み込みを高速化することを最大限に活用します。

デッドコードのリストの例: https://www.guardsquare.com/en/products/proguard/manual/examples#deadcode

27

Eclipseで1つのクラスで行うことで知られていることの1つは、すべてのメソッドをprivateに変更し、どのような苦情があるかを確認することです。使用されるメソッドの場合、これによりエラーが発生し、可能な限り低いアクセスレベルに戻します。未使用のメソッドの場合、これにより未使用のメソッドに関する警告が表示され、それらを削除できます。また、ボーナスとして、多くの場合、プライベートにすることができるパブリックメソッドを見つけます。

しかし、それは非常に手作業です。

26
skiphoppy

テストカバレッジツールを使用してコードベースを計測し、テストではなくアプリケーション自体を実行します。

Emma および Eclemma は、コードの実行ごとに実行されるクラスの割合を示すニースレポートを提供します。

15
jamesh

バグを見つける を使用して、リファクタリングのためのコードベースのターゲットが豊富な環境でファンクの一部を特定しやすくしました。また、 構造101 を考慮して、コードベースのアーキテクチャ内の複雑すぎるスポットを特定し、実際の沼地がどこにあるかを把握します。

13
Alan

理論的には、未使用のコードを決定論的に見つけることはできません。これの数学的証明があります(これは、より一般的な定理の特別な場合です)。興味があれば、停止問題を調べてください。

これは、さまざまな方法でJavaコードに現れます。

  • ユーザー入力、構成ファイル、データベースエントリなどに基づいてクラスをロードします。
  • 外部コードの読み込み。
  • オブジェクトツリーをサードパーティライブラリに渡す。
  • 等.

そうは言っても、IDEA IntelliJをIDEの選択肢として使用し、モジュール、未使用のメソッド、未使用のメンバー、未使用のクラスなどの依存関係を見つけるための広範な分析ツールを備えています。呼び出されないプライベートメソッドが未使用とタグ付けされているようにインテリジェントでもありますが、パブリックメソッドにはより広範な分析が必要です。

12
cletus

Eclipse Goto Windows>環境設定> Java>コンパイラー>エラー/警告
そしてそれらすべてをエラーに変更します。すべてのエラーを修正します。これが最も簡単な方法です。すばらしい点は、これにより、作成中にコードをクリーンアップできることです。

スクリーンショットEclipseコード:

enter image description here

7
smileprem

IntelliJには、使用されていないコードを検出するためのコード分析ツールがあります。できるだけ多くのフィールド/メソッド/クラスを非公開にしてみてください。そうすると、未使用のメソッド/フィールド/クラスがより多く表示されます

また、コード量を減らす方法として、重複するコードを見つけようとします。

私の最後の提案は、使用するとコードが簡単になるオープンソースコードを見つけることです。

5
Peter Lawrey

Structure101 スライスパースペクティブ は、 "orphans"または "Orphan groups "の依存関係を持たないクラスまたはパッケージのリスト(および依存関係グラフ)を提供します。メイン」クラスター。

DCDは一部のIDEのプラグインではありませんが、antまたはスタンドアロンから実行できます。静的なツールのように見え、 PMDとFindBugsができないことを行うことができます 。やってみます。

追伸以下のコメントで述べたように、プロジェクトは現在 GitHub にあります。

3
Heiner

コードをプロファイルし、コードカバレッジデータを提供するツールがあります。これにより、(コードの実行中に)どれだけ呼び出されているかを確認できます。これらのツールのいずれかを使用して、所有している孤立コードの量を調べることができます。

2
Vaibhav
  • FindBugsは、この種のことに優れています。
  • PMD(Project Mess Detector)は、使用できるもう1つのツールです。

ただし、どちらも、ワークスペースで使用されていないpublic staticメソッドを見つけることができません。誰かがそのようなツールを知っているなら、私に知らせてください。

2
graveca

Emma、Cobertura、Cloverなどのコードカバレッジツールは、コードをインスツルメントし、一連のテストを実行してコードのどの部分が呼び出されるかを記録します。これは非常に便利であり、開発プロセスに不可欠な部分です。テストスイートがコードをどの程度カバーしているかを特定するのに役立ちます。

ただし、これは実際のデッドコードを識別することとは異なります。テストでカバーされている(またはカバーされていない)コードのみを識別します。これにより、偽陽性(テストがすべてのシナリオをカバーしていない場合)と偽陰性(テストが実際のシナリオで実際に使用されていないコードにアクセスする場合)が得られます。

デッドコードを実際に識別する最良の方法は、ライブ実行環境でカバレッジツールを使用してコードを計測し、長期間にわたってコードカバレッジを分析することだと思います。

負荷分散された冗長環境で実行している場合(そうでない場合、なぜそうではないのでしょうか?)、アプリケーションの1つのインスタンスのみをインスツルメントし、ロードバランサーをランダムではあるが小さい部分に構成するのが理にかなっていると思いますユーザーはインスツルメントされたインスタンスで実行します。長期間にわたってこれを行うと(季節変動など、現実世界のすべての使用シナリオを確実にカバーできるようにするため)、実際の使用状況でコードのどの領域がアクセスされ、どの部分がアクセスされるかを正確に確認できるはずです。実際にはアクセスされないため、デッドコードです。

私はこれを個人的に見たことはなく、前述のツールを使用して、テストスイートを介して呼び出されていないコードをインストルメントおよび分析する方法がわかりません。

1
Vihung

Javaプロジェクトがあります- Dead Code Detector (DCD)。ソースコードの場合はうまく機能していないように見えますが、.jarファイルの場合は本当に良いです。さらに、クラスおよびメソッドでフィルタリングできます。

1

NetbeansこちらはNetbeansのプラグインです デッドコード検出器

未使用のコードにリンクして強調表示できるとよいでしょう。ここで投票およびコメントできます: バグ181458-未使用のパブリッククラス、メソッド、フィールドを検索

1
Leon

EMMAなどのユーザーカバレッジツール。しかし、それは静的なツールではありません(つまり、回帰テストと、考えられるすべてのエラーケースを通じてアプリケーションを実際に実行する必要がありますが、これは不可能です:))

それでも、EMMAは非常に便利です。

1

コードを計測し、使用されているコードと使用されていないコードを強調表示するCloverカバレッジツールを見つけました。 Google CodePro Analyticsとは異なり、WebApplicationsでも機能します(私の経験では、Google CodeProについて間違っている可能性があります)。

私が気づいた唯一の欠点は、Javaインターフェースを考慮していないことです。

0
Kashif Nazar

私はDoxygenを使用して、呼び出されないメソッドを見つけるためのメソッド呼び出しマップを開発します。グラフには、呼び出し元のないメソッドクラスターの島があります。常に何らかのメインエントリポイントから開始する必要があるため、これはライブラリでは機能しません。

0
jbruni

Eclipseは、到達できないコードを表示/強調表示できます。 JUnitはコードカバレッジを表示できますが、いくつかのテストが必要であり、関連するテストがないか、コードが実際に使用されていないかを判断する必要があります。

0
MattW.