2016-04-29 15 views
1

下図のように最近、私は私のpom.xmlにBan Transitive Dependencies pluginを追加しました:私はMavenのと私のアプリケーションを構築しようとすると'BanTransitiveDependencies failed'の背後にある理由は何ですか?

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-enforcer-plugin</artifactId> 
    <version>1.4.1</version> 
    <executions> 
     <execution> 
      <id>enforce-banned-dependencies</id> 
      <goals> 
       <goal>enforce</goal> 
      </goals> 
      <configuration> 
       <rules> 
        <banTransitiveDependencies> 
         <excludes> 
          <!-- the rule will not fail even if it detects ignoredArtifact 
           of group org.apache.maven, because it is excluded --> 
         </excludes> 
         <includes> 
         </includes> 
        </banTransitiveDependencies> 
       </rules> 
      </configuration> 
     </execution> 
    </executions> 
</plugin> 

、私は次のエラーを取得します:

[WARNING] Rule 0: org.apache.maven.plugins.enforcer.BanTransitiveDependencies failed with message: 

    org.hamcrest:hamcrest-all:jar:1.2:test has transitive dependencies: 
     commons-lang:commons-lang:jar:2.6:test 

を私はないです確かに私はここで何が起こっているのか理解している。なぜ推移的な依存関係が失敗するのですか?だから私はhamcrest-すべてのバージョンを変更することが出来るのです

<dependency> 
     <groupId>org.apache.commons</groupId> 
     <artifactId>commons-lang3</artifactId> 
     <version>3.4</version> 
    </dependency> 

:私はのpom.xmlに以下の依存関係を持っているところで

?またはpomm.xmlにもcommons-lang 2.6を追加する必要がありますか?

「過渡的な依存関係を禁止する」正しい方法は何ですか?

+0

はところで、あなたについてorg.hamcrestです:hamcrest-全てます。jar:1.2?バージョン1.2は利用できません(http://mvnrepository.com/artifact/org)。hamcrest/hamcrest-all)明らかに –

+0

@ A.DiMatteo http://repository.ow2.org/nexus/content/repositories/ow2-legacy/org/hamcrest/hamcrest-all/1.2/ –

答えて

1

banTransitiveDependenciesルールは、プロジェクトが望ましくない推移的な依存関係を継承しないことを確認するために使用されます。

  • <excludes>:無視する依存関係のリスト。
  • <includes>:考慮する依存関係のリスト。これらは、<excludes>構成の例外です。

デフォルトでは、何も除外されません。つまり、すべての推移的な依存関係はデフォルトで禁止されています。デフォルトでは何も除外せず、すべてを含めてもわずかな違いがあります。要点は、グローバルな方法で除外したいものを定義し、そのサブセットに含めるものを定義する必要があることです。

これは、あなたの例でビルドが失敗する理由です。デフォルトでは何も除外されず、commons-lang:commons-lang:jar:2.6に推移的な依存関係があります。ドキュメントから

例があることを説明します。この構成では

<excludes> 
    <!-- the rule will not fail even if it detects ignoredArtifact 
    of group org.apache.maven, because it is excluded --> 
    <exclude>org.apache.maven:ignoredArtifact</exclude> 
    <exclude>*:anotherIgnoredArtifact</exclude> 
</excludes> 
<includes> 
    <!-- override "org.apache.maven:ignoredArtifact" to fail 
    if exactly 1.0 version of ignoreArtifact is detected 
    to be transitive dependency of the project --> 
    <include>org.apache.maven:ignoredArtifact:[1.0]</include> 
</includes> 

、彼らは推移としてorg.apache.maven:ignoredArtifactのバージョン1.0を禁止します。

org.apache.maven:ignoredArtifactと一致するすべての推移的依存関係がすべての依存関係は、(それらのIDを持つすべてのバージョンを意味する)ignoredArtifactorg.apache.mavenのグループIDとアーティファクトIDを有する、すなわち、除外されているように彼らは<excludes>を再定義します。その後、<includes>を再定義して、org.apache.maven:ignoredArtifactのバージョン1.0のみが禁止されます。

+0

私の場合は、 commons-lang:commons-lang:jar:2.6をincludeタグに追加しますか? –

+0

@KorayTugay質問は何を禁止したいですか? :) 'commons-lang:commons-lang:jar:2.6'を禁止したいのであれば、私の答えと同じ設定をする必要があります。 – Tunaki

+0

私は分かりませんが、この場合2.6以外の他のオプションはありますか? 2.6以外のものを禁止したいのですが? –

1

BanTransitiveDependenciesルールは、依存関係のいずれか(つまり、推移的な依存関係)がビルドに含まれている場合にトリガーされます。

この警告を避けるために、あなたがorg.hamcrest:hamcrest-all:1.2への依存を宣言するときcommons-lang:commons-lang:jar:2.6を除外する必要があると思いますが:

<dependency> 
    <groupId>org.hamcrest</groupId> 
    <artifactId>hamcrest-all</artifactId> 
    <version>1.2</version> 
    <scope>test</scope> 
    <exclusions> 
    <exclusion> 
     <artifactId>commons-lang</artifactId> 
     <groupId>commons-lang</groupId> 
    </exclusion> 
    </exclusions> 
</dependency> 
+0

ああ、私は参照してください..明確な答え、ありがとう。しかし、hamcrest-allがcommons-lang 3.4で正しく動作しないとどうなりますか? –

+0

@KorayTugay質問は何を禁止したいですか?正しい方法は、[私の答え](http://stackoverflow.com/a/36933426/1743880)で説明されているように、何も除外し、除外されたものに何かを含めるデフォルトを上書きするものを除外することです。 – Tunaki

+0

@KorayTugay @ Tunakiは言ったように、あなたが望むライブラリを決定するのはあなた次第です。 特定の依存関係を避けたい場合は、[禁止された依存関係の規則](https://maven.apache.org/enforcer/enforcer-rules/bannedDependencies.html)が適しています。たとえば、Spring Frameworkを使用していますが、代わりにslf4jを使用しているため、 'commons-logging'を使用したくない場合です。 – Kolargol00

関連する問題