web-dev-qa-db-ja.com

Mavenの未使用/未宣言の依存関係とは何ですか?それらをどうするか?

Maven dependency:analyzeは私のプロジェクトの依存関係について文句を言います。使用されていないものと宣言されていないものをどのように判断しますか?それらについてどうすればよいですか?

例:

$ mvn dependency:analyze 
...
[WARNING] Used undeclared dependencies found:
[WARNING]    org.slf4j:slf4j-api:jar:1.5.0:provided
[WARNING]    commons-logging:commons-logging:jar:1.1.1:compile
[WARNING]    commons-dbutils:commons-dbutils:jar:1.1-osgi:provided
[WARNING]    org.codehaus.jackson:jackson-core-asl:jar:1.6.1:compile

...
[WARNING] Unused declared dependencies found:
[WARNING]    commons-cli:commons-cli:jar:1.0:compile
[WARNING]    org.mortbay.jetty:servlet-api:jar:2.5-20081211:test
[WARNING]    org.Apache.httpcomponents:httpclient:jar:4.0-alpha4:compile
[WARNING]    commons-collections:commons-collections:jar:3.2:provided
[WARNING]    javax.mail:mail:jar:1.4:provided

注:これらの依存関係の多くはランタイムコンテナーで使用されます。クラスパスに同じライブラリが異なるバージョンで2回存在することを避けるために、提供されているものとして宣言しました。

60
b7kich

Mavenがこれをどのように決定するかはわかりません。これによって報告されるすべての項目に対処する必要はありませんが、この情報は必要に応じて使用できます。

未宣言の依存関係を使用は必須ですが、プロジェクトで依存関係として明示的に宣言されていないものです。ただし、プロジェクト内の他の依存関係の推移的な依存関係のおかげで利用可能です。これらの依存関係を明示的に宣言することをお勧めします。これにより、これらの依存関係のバージョンを制御することもできます(おそらく、ランタイムが提供するバージョンと一致します)。

未使用の宣言された依存関係については、削除することをお勧めします。なぜプロジェクトに不要な依存関係を追加するのですか?しかし、その後、推移性がこれらをもたらす可能性があり、おそらく、ランタイムバージョンと競合します。この場合、基本的にversionを制御するためにそれらを指定する必要があります。

ところで、 mvn dependency:treeは、プロジェクトの依存関係ツリーを提供します。これにより、各依存関係がプロジェクトにどのように適合するかをより適切に把握できます。

73
Raghuram

答え:

「使用されていないものと宣言されていないものをどのように判断しますか?」。

Mavenは、生のバイトコードを分析する Object WebASM フレームワークを使用します。すべてのクラスを調べてから、これらが参照するすべてのクラスのリストを作成します。それが方法です。

何をすべきかについて、実際に使用されていないことが確実でない限り、「未使用の宣言された依存関係」を削除することはお勧めしません。

5
Zwakele Mgabhi