web-dev-qa-db-ja.com

Mavenの依存関係をテストランタイムとしてのみ宣言する

Maven依存関係をテストランタイム(テストコンパイルではない)クラスパスにのみ使用されると宣言する最良の方法は何ですか?

具体的には、典型的なコンパイルスコープの依存関係としてslf4j-api(ロギングファサード)が必要ですが、テストランタイムクラスパスにのみslf4j-simple(単体テストに適した最低限の実装)が必要です(そうではありません)。テストコンパイルに必要)。私はこれをやっています:

<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-api</artifactId>
</dependency>
<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-simple</artifactId>
  <scope>test</scope>
</dependency>

ただし、これの欠点は、dependency:analyzeslf4j-simpleを未使用として報告することです。これは、おそらくコンパイルに必要ないためです。

[WARNING] Unused declared dependencies found:
[WARNING]    org.slf4j:slf4j-simple:jar:1.7.7:test

runtime依存関係を推移的に継承したくないため、使用できません(たとえば、ダウンストリームの依存関係で代わりにlog4jなどを使用できます)。 runtimeoptional=trueで試しましたが、同じ警告が表示されます。

(依存関係プラグインにignoreNonCompileを設定することもできますが、それは他の潜在的な問題を隠す非常に鈍器のようです。)

22
Trevor Robinson

ここで必要なことを正確に実行するスコープはありません。 testは利用可能な最良のオプションです。

test-runtimeスコープが以前に要求されており( Re:テストランタイムスコープが必要ですか? )、推奨される回避策は、既に検出したignoreNonCompile構成です。

dependency:analyzeにはすでにいくつかの制限があります( "一部のケースは検出されません(定数、ソースのみの保持を持つアノテーション、javadoc内のリンク)" )。警告するtest- scopeの依存関係は誤検知であることを受け入れる必要がある場合があります。

(あなたcouldは、テストの定義を別のモジュールに分割します。このモジュールにはslf4j実装の依存関係がなく、別のモジュールで実行します。 。それだけの価値はないと思います。)

13
Joe

Mavenにはテストランタイムの概念はありません。唯一の本当の欠点は、これらのランタイムテストの依存関係を未使用として識別する依存関係分析です。ただし、これらはテストの依存関係にすぎないため、これはかなり害がなく、このプロジェクトに推移的に依存している他のプロジェクトに問題を引き起こすことはありません。

4
Brett Okken

Maven-dependency-plugin 2.10( リビジョン1649454 、2015年1月)以降、構成に ignoredDependenciesignoredUnusedDeclaredDependencies およびのリストを追加することもできます。 ignoredUsedUndeclaredDependencies

3

回避策として、メインプロジェクトに依存するテストケースを含む別のMavenプロジェクトを用意することをお勧めします

0
jnr