web-dev-qa-db-ja.com

Javaパッケージサイクルの検出:関連する特定のクラスを見つけるにはどうすればよいですか?

検出するのにどのツールをお勧めしますかJavaパッケージの循環依存関係、検出された「パッケージ全体のサイクル」に含まれる特定のクラスを明示的にリストすることを目的としているため、

classycleJDepend について知っていますが、どちらも循環パッケージの依存関係に関連するクラスのリストに失敗します。 Metrics は、興味深いサイクルのグラフィック表現を持っていますが、これもパッケージに限定されており、いつか読むのは非常に困難です。

私は次のものを得るために疲れています:

"これら3つのパッケージ間にパッケージサイクル依存関係があります
それぞれにxxxクラスがあります
適切なクラスを見つけてこのサイクルを断ち切ります "

サイクルが検出された理由を実際に説明するために追加の手順を実行するツールを知っていますか(つまり、「関係するクラスを一覧表示する」)。


Riiight ...結果を宣言する時間:

@ l7010.de:努力をありがとう。私は(特に十分な担当者がいる場合は)投票して、特に「CAP」の回答を求めます...しかし、CAPは水に沈んでおり、Eclipse 3.4との互換性がなくなりました。残りは商用で、私はフリーウェアだけを探します。

@ daniel6651:ありがとうございましたが、言われたとおり、フリーウェアのみです(そもそも言及しなかったことをお詫びします)。

findbugsを頻繁に使用している@izb(現在、最新の1.3.5を使用しています)をクリックして回答を受け入れます... findbugがサイクルを検出するためにアクティブ化するオプションを説明できる場合は、その機能は .8.7バージョンが渡される (クラス間の循環依存関係を見つけるための 'New Style Detectorを探す')についてのみ言及されており、私はテストできません。更新:これで動作し、そのオプションがアクティブ化されていない古いfindbugs構成ファイルがありました。私はまだ好きです [〜#〜] cad [〜#〜] でも;)

THE ANSWER is ...を参照してください 下記の自分の(2番目の)回答

38
VonC

Findbugsは循環クラスの依存関係を検出でき、Eclipseプラグインもあります。

http://findbugs.sourceforge.net/

14
izb

ええと...テスト後 上記のDepFinder は、単純な依存関係をすばやく検出するのに最適ですが、クラスの数に合わせて拡張できない...

したがって、実際の実際の答えは:CDA-Class Dependency Analyzer

これは高速で最新の使いやすいツールであり、クラスとその循環依存関係をグラフィカルに表現します。夢が実現する ;)

クラス(.class)のディレクトリのみを入力するワークセットを作成する必要があります(完全なクラスパスは必要ありません)。
オプション「循環依存関係を検出- ALT-C"アドバタイズとして機能し、私の468クラスを分析するためにCPUの100%を何時間も要しません。
注:ワークスペースを更新するには、クラスの新しいスキャンをトリガーするために、ワークスペースを再度開く(!)必要があります。

screenshot

25
VonC

Highwheel クラスとパッケージのサイクルを検出し、依存関係のソースをクラス/メソッド/フィールドレベルまで報告し、関係のタイプ(継承、構成、メソッドシグネチャの一部など)を示します。

また、大きなサイクルをサブエレメントに分解します。サブエレメントは、個別に理解/取り組むことができます。

出力は、最新のブラウザーを必要とするSVGコンテンツが埋め込まれたHTMLです。

4
henry

これを行う Structure101 もあります。

4
squiddle

ソナー を使用してパッケージサイクルを検出します。依存関係のニースグラフを描画し、どの依存関係が間違っているかを示します。依存関係が使用されているソースに移動することもできます。

http://www.sonarsource.org/fight-back-design-erosion-by-breaking-cycles-with-sonar/ を参照してください

4
Stijn Van Bael

最初の考えられる答えは...きれいではありません。しかし、それは私が求めていることを実行し始めます(より良い解決策は 下に表示 です)。

依存関係ファインダーダウンロードする 、解凍します。

これはこれまでで最もモダンでアクティブなプロジェクトではありませんが、[Dependency Finder] /bin/DependencyFinder.batを編集して、DEFAULT_DEPENDENCYFINDER_HOMEのパスを追加し、Java_HOMEを設定すると、プロジェクトを起動できます。

次に、[抽出]ボタン(CTRL-E-最初のボタン)をクリックし、クラスパスを入力して、スキャンしてみます。

トリッキーな部分は、「プログラミング要素」と「クロージャ」のアイテムの正しいセットをクリックして、結果の詳細レベルに圧倒されないようにすることです。

  • 左側の「クラス」のみを選択します(「プログラミング要素」)。
  • 右側の「クラス」のみを選択します(「クロージャー」)。
  • 除外パターンとして「/javax?./,/org./,/Sun./」を追加します(プログラミング要素とクロージャーの両方)。
  • ホイールをクリックします(最後のボタン-すべてを計算- CtrlA)。

そして、ここに行きます。

「<->」が表示されているときはいつでも、ニース循環依存関係を持っています。 (「閉鎖」側で「機能」を選択すると、サイクルをトリガーする機能を知ることもできます-素晴らしいです。)

他の提案をテストする準備ができています。

1
VonC

また、オープンソースツール [〜#〜] cap [〜#〜] を使用できます。これはEclipseプラグインです。

CAPにはグラフィカルなパッケージビューがあり、クラスへの線が表示されるため、(円のサイズに応じて)数回クリックすると原因がわかります。

1
squiddle

これを行う1つのツールは、ソフトウェア tomograph です。これは商用であり、UIは:o

0
squiddle

いくつかの商用ツールがあります:この目的で使用できるStructure101とLattix。

0
daniel6651