291 測定値

Maven の依存関係アナライザーを使用して未使用の依存関係を削除するのは、今日では危険なアドバイスです

Nicolas Fränkel4m2025/03/13
Read on Terminal Reader

長すぎる; 読むには

Maven アナライザーの現在の状態では、最新の Spring Boot プロジェクトには何のメリットも提供されません。
featured image - Maven の依存関係アナライザーを使用して未使用の依存関係を削除するのは、今日では危険なアドバイスです
Nicolas Fränkel HackerNoon profile picture


最近、私の良き友人である Richard Fichtner が、宣言されているが使用されていない依存関係を削除するためにmvn dependency:analyzeコマンドを使用するようアドバイスしてくれました。

数年前は素晴らしいアイデアでしたが、今日では危険なアドバイスです。この記事では、このプラグインの機能と、最も単純なプロジェクト以外では使用すべきでない理由について説明したいと思います。

mvn dependency:analyzeコマンド

Maven はプラグイン アーキテクチャを使用します。上記のコマンドでは、プラグインはmaven-dependency-pluginです。プラグインは、いくつかの関連するgoalsをホストします。ここでは、 analyzeです。


このプロジェクトの依存関係を分析し、使用されていて宣言されているもの、使用されていて宣言されていないもの、未使用で宣言されているものを判別します。このゴールはスタンドアロンで使用することを意図しているため、常にtest-compileフェーズを実行します。ビルドライフサイクルに参加する場合は、代わりにdependency:analyze-onlyゴールを使用してください。


デフォルトでは、 maven-dependency-analyzerを使用して分析を実行しますが、バイトコード レベルで動作するため制限があります。ただし、 analyzerパラメータを使用して任意のアナライザーをプラグインできます。


--依存関係:分析


maven-dependency-analyzerは共有 Maven コンポーネントです。その説明は非常にわかりやすいです:


宣言されていない、または未使用の成果物についてプロジェクトの依存関係を分析します。

警告: 分析はソースではなくバイトコードに対して行われるため、定数、ソースのみが保持される注釈、Javadoc 内のリンクなど、一部のケースは検出されません。依存関係がこれらだけに使用される場合、結果が不正確になる可能性があります。


メインコンポーネントはProjectDependencyAnalyzerで、 ClassAnalyzerDependencyAnalyzerを使用します。


-- Maven 依存性アナライザー


警告は、バイトコードレベルで動作することを明確に示しています。特に、ソース レベルの注釈は考慮されないことが明示的に示されています。

Spring Boot スターター

かなり前に、独自のSpring Boot スターターを設計する方法を説明しましたが、それ以来あまり変わっていません。Spring Boot スターターを初めて使用する場合は、ここに概要を示します。


SpringBoot は AutoConfiguration クラスに依存しています。AutoConfiguration クラスは通常の構成クラスであり、アプリケーション クラスに貢献します。Spring プロパティの存在など、特定のアクティベーション条件を設定できますが、これらは自動構成に固有のものではありません。


非常に簡略化されたフローは次のとおりです。


Spring Boot の自動構成の簡略化されたシーケンス図


Spring Boot に自動的に付属する JAR はorg.springframework.boot:spring-boot-autoconfigureです。META META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.importsの内容を確認できます。


 ... org.springframework.boot.autoconfigure.web.client.RestClientAutoConfiguration org.springframework.boot.autoconfigure.web.client.RestTemplateAutoConfiguration org.springframework.boot.autoconfigure.web.embedded.EmbeddedWebServerFactoryCustomizerAutoConfiguration org.springframework.boot.autoconfigure.web.reactive.HttpHandlerAutoConfiguration org.springframework.boot.autoconfigure.web.reactive.ReactiveMultipartAutoConfiguration org.springframework.boot.autoconfigure.web.reactive.ReactiveWebServerFactoryAutoConfiguration org.springframework.boot.autoconfigure.web.reactive.WebFluxAutoConfiguration org.springframework.boot.autoconfigure.web.reactive.WebSessionIdResolverAutoConfiguration org.springframework.boot.autoconfigure.web.reactive.error.ErrorWebFluxAutoConfiguration org.springframework.boot.autoconfigure.web.reactive.function.client.ClientHttpConnectorAutoConfiguration org.springframework.boot.autoconfigure.web.reactive.function.client.WebClientAutoConfiguration org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration org.springframework.boot.autoconfigure.web.servlet.HttpEncodingAutoConfiguration org.springframework.boot.autoconfigure.web.servlet.MultipartAutoConfiguration org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration org.springframework.boot.autoconfigure.websocket.reactive.WebSocketReactiveAutoConfiguration org.springframework.boot.autoconfigure.websocket.servlet.WebSocketServletAutoConfiguration org.springframework.boot.autoconfigure.websocket.servlet.WebSocketMessagingAutoConfiguration org.springframework.boot.autoconfigure.webservices.WebServicesAutoConfiguration org.springframework.boot.autoconfigure.webservices.client.WebServiceTemplateAutoConfiguration


例として、 RestClientAutoConfiguration次に示します。


 @AutoConfiguration(after = { HttpClientAutoConfiguration.class, HttpMessageConvertersAutoConfiguration.class }) //1 @ConditionalOnClass(RestTemplate.class) //2 @Conditional(NotReactiveWebApplicationCondition.class) //3 public class RestTemplateAutoConfiguration { // Class body }
  1. 自動構成クラスの順序を設定する
  2. RestTemplateクラスがクラスパス上にある場合にアクティブ化します
  3. リアクティブウェブアプリのコンテキストでない場合はアクティブ化します


クラスローダーは、 RestTemplateクラスがクラスパス上にあるかどうかに関係なくRestTemplateAutoConfigurationクラスを正常にロードすることに注意してください。Spring は、上記のようにこのメカニズムを最大限に活用します。実際には、アノテーションで構成されたクラスの解決は、明示的にアクセスされるまで延期されます。

maven-dependency-analyzer現代に導入する

コミッターは 2007 年にアナライザーを設計しました。これが当時の状態です。Spring Boot はその後、2010 年に開始されました。このため、アナライザーはアノテーションで遅延クラス読み込みを採用しませんでした。これはまだ当てはまらないことに注意してください。このプロジェクトはあまり注目されていません。


Spring Boot プロジェクトでプラグインを使用すると、誤検知が多く発生します。PostgreSQL で WebFlux と R2DBC を使用するシンプルな Spring Boot プロジェクトで試してみました。


以下は、 mvn analyze:dependenciesを実行したときの出力の一部です。


 [WARNING] Unused declared dependencies found: [WARNING] org.springframework.boot:spring-boot-starter-data-r2dbc:jar:3.4.0:compile [WARNING] org.testcontainers:postgresql:jar:1.20.4:test [WARNING] org.testcontainers:r2dbc:jar:1.20.4:test


これらの依存関係のいずれかを削除すると、テストは実行されません。


アナライザーを Spring Boot プロジェクトで動作させるには何が必要でしょうか? アナライザーを分析してみましょう。


アナライザークラス図


プラグインを使用すると、別のアナライザーを構成できます。


使用するプロジェクト依存関係アナライザーを指定します (plexus コンポーネントの role-hint)。デフォルトでは、maven-dependency-analyzer が使用されます。これを使用するには、アナライザーのコードを含むこのプラグインの依存関係を宣言する必要があります。アナライザーには宣言された Plexus ロール名が必要であり、ここでロール名を指定します。


  • タイプ: java.lang.String

  • 2.2以降

  • 必須: No

  • ユーザープロパティ: analyzer

  • デフォルト: default


--依存関係:分析


上記を再利用し、Spring Boot に固有のものを追加した全体的なアナライザーを作成できます。

結論

Maven アナライザーの現在の状態は、最新の Spring Boot プロジェクトには何のメリットももたらしません。既存のコードは、構成や拡張に対してオープンです。ただし、多くの Spring Boot ロジックを埋め込む必要があります。Quarkus および Micronaut プロジェクトの場合、専用のコードも必要になります。


時間と労力をかける価値があるかどうかはわかりません。価値があると思われる場合は、このブログ投稿が初期段階の分析として役立つことを願っています。


さらに進むには:





2025年3月9日にA Java Geekで最初に公開されました

Trending Topics

blockchaincryptocurrencyhackernoon-top-storyprogrammingsoftware-developmenttechnologystartuphackernoon-booksBitcoinbooks