最近、私の良き友人である Richard Fichtner が、宣言されているが使用されていない依存関係を削除するために コマンドを使用するようアドバイスしてくれました。 mvn dependency:analyze https://bsky.app/profile/did:plc:cc2k5egfzqpf3nbjrs5xox4r/post/3lcxfnsc2h62m?ref_src=embed&embedable=true 数年前は素晴らしいアイデアでしたが、今日では危険なアドバイスです。この記事では、このプラグインの機能と、最も単純なプロジェクト以外では使用すべきでない理由について説明したいと思います。 コマンド mvn dependency:analyze Maven はプラグイン アーキテクチャを使用します。上記のコマンドでは、プラグインは です。プラグインは、いくつかの関連する をホストします。ここでは、 です。 maven-dependency-plugin goals analyze このプロジェクトの依存関係を分析し、使用されていて宣言されているもの、使用されていて宣言されていないもの、未使用で宣言されているものを判別します。このゴールはスタンドアロンで使用することを意図しているため、常に フェーズを実行します。ビルドライフサイクルに参加する場合は、代わりに ゴールを使用してください。 test-compile dependency:analyze-only デフォルトでは、 を使用して分析を実行しますが、バイトコード レベルで動作するため制限があります。ただし、 パラメータを使用して任意のアナライザーをプラグインできます。 maven-dependency-analyzer analyzer -- 依存関係:分析 は共有 Maven コンポーネントです。その説明は非常にわかりやすいです: maven-dependency-analyzer 宣言されていない、または未使用の成果物についてプロジェクトの依存関係を分析します。 : 分析はソースではなく に対して行われるため、定数、ソースのみが保持される注釈、Javadoc 内のリンクなど、一部のケースは検出されません。依存関係がこれらだけに使用される場合、結果が不正確になる可能性があります。 警告 バイトコード メインコンポーネントは で、 と を使用します。 ProjectDependencyAnalyzer ClassAnalyzer DependencyAnalyzer -- Maven 依存性アナライザー 警告は、 レベルで動作することを明確に示しています。特に、ソース レベルの注釈は考慮されないことが明示的に示されています。 バイトコード Spring Boot スターター かなり前に、 を設計する方法を説明しましたが、それ以来あまり変わっていません。Spring Boot スターターを初めて使用する場合は、ここに概要を示します。 独自の Spring Boot スターター SpringBoot は AutoConfiguration クラスに依存しています。AutoConfiguration クラスは通常の構成クラスで 、アプリケーション クラスに貢献します。Spring プロパティの存在など、特定のアクティベーション条件を設定できますが、これらは自動構成に固有のものではありません。 あり 非常に簡略化されたフローは次のとおりです。 Spring Boot に自動的に付属する JAR は です。META の内容を確認できます。 org.springframework.boot:spring-boot-autoconfigure 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 } 自動構成クラスの順序を設定する クラスがクラスパス上にある場合にアクティブ化します RestTemplate リアクティブウェブアプリのコンテキストでない場合はアクティブ化します クラスローダーは、 クラスがクラスパス上にあるかどうか 、 クラスを正常にロードすることに注意してください。Spring は、上記のようにこのメカニズムを最大限に活用します。実際には、アノテーションで構成されたクラスの解決は、 アクセスされるまで延期されます。 RestTemplate に関係なく RestTemplateAutoConfiguration 明示的に 現代に導入する 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 プロジェクトの場合、専用のコードも必要になります。 時間と労力をかける価値があるかどうかはわかりません。価値があると思われる場合は、このブログ投稿が初期段階の分析として役立つことを願っています。 さらに進むには: 依存関係:分析 Maven 依存性アナライザー 独自の Spring Boot スターターの設計 – パート 1 独自の Spring Boot スターターの設計 – パート 2 2025年3月9日に で最初に公開されました A Java Geek