12

大規模な進化するマルチモジュール Maven プロジェクトを開発している場合、pom に不要な依存関係がいくつかあることは避けられないようです。それらは他の依存関係によって推移的に含まれているためです。たとえば、元々 C を含むモジュール A がある場合に、これが発生します。後でリファクタリングし、A をモジュール B に依存させ、モジュール B が C に依存するようにします。十分に注意しないと、B と C の両方が含まれてしまうことになります。 A の依存リスト。しかしもちろん、C を A の pom に入れる必要はありません。とにかく、C は推移的に含まれているからです。そのような不要な依存関係を見つけるツールはありますか?

(これらの依存関係は実際には害はありませんが、実際のモジュール構造がわかりにくくなる可能性があり、通常は pom に含まれるものが少ない方が良いです。:-)

4

3 に答える 3

13

ある程度使えますがdependency:analyze、あまり役に立ちません。JBoss Tattletaleも確認してください。

しばらく前に、poms をより深く分析できるようにするためにmaven-storyteller-pluginを開始しましたが、このプロジェクトは本番環境や一般利用にはほど遠いものです。storyteller:recount目標を使用して、未使用/冗長な依存関係を分析できます。

ストーリー全体の問題は、「未使用」のものをどのように判断するかです。分析が可能なのは、インスタンスのクラス参照です。ただし、リフレクションを直接または非直接的に使用している場合は機能しません。

2014 年 11 月更新。

Storyteller プラグインの古いコードを GitHub に移動しました。他のユーザーが使用できるように、更新して中央にリリースします。

于 2010-03-31T15:32:19.437 に答える
2

個人的には、M2Eclipseのpomエディターを使用して、依存関係ツリー(2Dツリー)を視覚的に表示します。次に、成果物(war、ear)のlibディレクトリを調べます。次に、M2Eclipse pom依存関係ビューアで、すべてのサードパーティに移動し、除外する依存関係を右クリックします(除外は適切な依存関係に自動的に追加されます)。

黄金のルールはなく、基本的なヒントがいくつかあります。

多くのpomは正しくありません。そこにある多くのサードパーティライブラリは、デフォルトのコンパイルスコープであまりにも多くの依存関係を必要とします。誰もが慎重にpomを作成する場合は、それほど多くの不要な依存関係を持たないようにする必要があります。

依存関係の名前から、除外する必要があるものを推測する必要があります。最も良い例は、パーサー、トランスフォーマー、ドキュメントビルダー(xalan、xerces、xalan alfredなど)です。それらを削除して、内部のjdk1.6パーサー、一般的なApacheのものを使用してみてください。log4jも一見の価値があります。

異なるバージョンの重複ライブラリがない場合は、lib配信も定期的に確認してください(mavenの依存関係リゾルバーはそれを回避する必要があります)

ボトムアップで、共通のモジュールから始めて、サービスレイヤーまで上がって、すべてのモジュールの依存関係を減らします。モジュールの耳/戦争で始めようとしないでください。難しすぎるでしょう。

テストまたは比較して、成果物がまだ機能しているかどうかを頻繁に確認し、古い成果物を新しい成果物と比較します(特に、winmerge/beyoncompareで消えたものをweb-inf/libディレクトリで)

于 2010-04-08T20:36:22.760 に答える
1

A -> B, B -> Cの場合、 A -> (B, C) のようにリファクタリングします。AがまだBに対してコンパイルされている場合は、依存関係を推移的に受け取るため、単に依存関係を取得したくありません。

A -> (B-1.0, C-1.0), B-1.0 -> C-1.0の場合を考えてみてください。すべてが同期しているため、「重複」を避けるために、 Aの依存関係からCを削除します。次に、 A をアップグレードしてB-2.0 -> C-2.0を使用します。AC-1.0クラスを必要としていますが、 C-2.0クラスを見つけたため、エラーが表示され始めます。このシナリオではすぐに調整できますが、多くの依存関係がある場合はそうではありません。

推移的な依存関係の競合がいつ発生するかを理解できるように、クラスパスでC-1.0を見つけることを明示的に期待しているというAの pomの情報が非常に必要です。繰り返しになりますが、Maven は、特定の jar の「最も近い」バージョンがクラスパスに配置されるようにします。しかし、問題が発生した場合、取得できるすべての依存関係メタデータが必要になります。

もう少し実用的なメモでは、依存関係を pom から削除でき、すべてのユニット/統合/受け入れテストがまだ合格している場合、依存関係は使用されません。;-)

于 2010-03-31T16:40:07.293 に答える