2011-10-26 21 views
23

たとえば、2つのMavenプロジェクトがあります。 1つは「プロジェクト - 親」です。もう一つは「プロジェクト・チャイルド」です。明らかに、 "project-child"は "project-parent"のサブプロジェクトです。Mavenで親のプロジェクトから依存関係を除外する方法は?

"project-parent"にはlog4jの依存関係があります。しかし、私はそれを「プロジェクト・チャイルド」から除外したい。方法はありますか?

log4jを "project-parent"から "project-child"に移動する必要があります。それはまったく正しい。 しかし、私は "プロジェクト親"のPOMを変更することはできません。

ありがとうございます。

答えて

9

私はMaven2ではこれを実現する方法がないと考えています。これはPOMの継承が のものだからです。しかし、私が考えることができる1つのトリックがあります:

内部アーティファクトリポジトリにアーティファクトをアップロードする権利があるとします。空のJARを作成してlog4j:log4jとして展開します(明らかに異常なバージョン(log4j:log4j:9999など))。あなたのプロジェクトにこのような依存関係を追加してください。次に、親の依存関係を上書きします。これは、空のJARに依存します。

+1

サイドノート:誰かが同じようなことをやって、「空」の成果物のような種類の公開リポジトリを提供している(http://version99.qos.ch/) 。彼らはバージョンとして '99-empty'を使います。人々は私が提案したアプローチがこれを大会として使うかもしれないと考えています。 –

1

私が質問を理解したら、あなたが必要とするのは次のようなものです。それは依存関係を取り込み、その依存関係を依存関係リストに追加することを除外します。多くの場合、これは、他のパッケージで参照されているものの代わりに新しいバージョンのパッケージを挿入する場合に使用されます。

<dependency> 
    <groupId>log4j</groupId> 
    <artifactId>log4j</artifactId> 
    <version>1.2.15</version> 
    <exclusions> 
     <exclusion> 
      <groupId>com.sun.jmx</groupId> 
      <artifactId>jmxri</artifactId> 
     </exclusion> 
     ... 
    </exclusions> 
    ... 

あなたの代わりに<parent>関係について話している場合、私はこれを行う方法があるかわかりません。 <parent>から<dependency>に切り替えることはできますか?

+0

私は親プロジェクトから継承された依存関係を意味しますが、あなたの例として直接依存からの推移的依存関係ではありません。とにかく、ありがとう。 :) – Smartmarkey

+0

ええ、私はあなたがそれを行うことができるか分からない。この質問を見ましたか?http://stackoverflow.com/questions/2681759/is-there-anyway-to-exclude-artifacts-inherited-from-a-parent-pom – Gray

+0

リンクありがとうございます。私はそれを読んだ。正式にMavenに方法がないように見えます。私は一種の回避策を講じなければならない。 – Smartmarkey

9

実際に依存関係を除外する方法はわかりませんが、ターゲット配布から除外することはできますが、それはちょっとしたハックです。依存関係の範囲を、最終配布時に除外できるものに変更する必要があります。

だから、私の親はJUnitの4.8への依存性を持っていたと言う、私のポンポンにあなたが言う:

<dependency> 
    <groupId>junit</groupId> 
    <artifactId>junit</artifactId> 
    <version>4.8</version> 
    <scope>provided</scope> 
</dependency> 

は、だから我々は、提供する範囲を変更しています。この仕組みの説明については、NoClassDefFoundError: org/junit/AfterClass during annotation processingへの私の答えを見てください。残念ながら、これはビルドには影響を与えませんが、あなたは、最終的な配布のための依存関係をコピーしているとき、あなたは、最終的なディストリビューションに依存関係をコピーしないためにexcludeScopeの構成要素を使用することができます。

<plugin> 
<artifactId>maven-dependency-plugin</artifactId> 

<executions> 
    <execution> 
     <id>copy-libs</id> 
     <phase>package</phase> 
     <goals> 
      <goal>copy-dependencies</goal> 
     </goals> 
     <configuration> 
      <outputDirectory>${project.build.directory}/lib</outputDirectory> 
      <excludeScope>provided</excludeScope> 
     </configuration> 
    </execution> 
+0

ありがとう。私は配布パッケージから不要な依存関係を除外しましたが、Maven Assemblyプラグインのassembly.xmlにを使用しています。私は、Eclipseのように開発環境から不要な依存関係を除外する方法を求めています。 :) – Smartmarkey

0

一つのハック方法これを達成するには、project-childの依存関係を 'test'スコープ(または使用できる最も軽いスコープがあれば)で指定することです。これは、project-parentで指定されたスコープを "非表示"にして、テストコードのみで使用可能になり、コンパイルと実行時の両方で非テストコードでは使用できなくなります。

私はこのバグフィーチャーを主に間違って見つけました。私の場合、プロジェクトの親は '提供された'スコープで指定された依存関係(実際に祖父母から継承された)と同じ依存関係を持っていましたが、私のプロジェクト - 子供は 'コンパイル'スコープ依存性を持つプロジェクト兄弟を持っていました。 project-childはプロジェクト兄弟に依存する実行可能ファイルなので、project-childの実行時クラスパスが使用されているので、実行時にNoClassDefFoundErrorがスローされました。これには '提供された'依存関係は含まれませんでした。私は、 'コンパイル'が '提供された'を「隠す」ように、プロジェクト兄弟からプロジェクト親に「コンパイル」依存関係を移動することでこれを修正しました。

1

私はあなたのように同じ質問に遭遇しました。 私のプロジェクトでは、親のpomをparent.pomと呼ぶことにしましょう。親はlog4j、slf4jを次のように定義しました。

 <dependency> 
      <groupId>org.slf4j</groupId> 
      <artifactId>slf4j-api</artifactId> 
      <version>${slf4j-api.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>log4j</groupId> 
      <artifactId>log4j</artifactId> 
      <version>${log4j.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>org.slf4j</groupId> 
      <artifactId>jcl-over-slf4j</artifactId> 
      <version>${slf4j-api.version}</version> 
     </dependency> 

     <dependency> 
      <groupId>org.slf4j</groupId> 
      <artifactId>slf4j-log4j12</artifactId> 
      <version>${slf4j-log4j12.version}</version> 
     </dependency> 

子プロジェクトはchild.pomに依存関係を呼び出します。しかし、私はlog4j-1.2.xの依存関係は望ましくなく、slf4jのバージョンを増やしたいと思っています。

So.私はその後、親

<dependency> 
     <groupId>parent</groupId> 
     <artifactId>myartifactId</artifactId> 
     <version>${my parent version}</version> 
</dependency> 

の依存関係を追加し、log4jの

<dependency> 
     <groupId>parent</groupId> 
     <artifactId>myartifactId</artifactId> 
     <version>${my parent version}</version> 
     <exclusions> 
      <exclusion> 
       <groupId>log4j</groupId> 
       <artifactId>log4j</artifactId> 
      </exclusion> 
     </exclusions> 
</dependency> 

を削除して、明示的に

子ポンポンに
<dependency> 
     <groupId>org.slf4j</groupId> 
     <artifactId>slf4j-api</artifactId> 
     <version>1.7.6</version> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.logging.log4j</groupId> 
     <artifactId>log4j-slf4j-impl</artifactId> 
     <version>2.8.2</version> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.logging.log4j</groupId> 
     <artifactId>log4j-api</artifactId> 
     <version>2.8.2</version> 
    </dependency> 

    <dependency> 
     <groupId>org.apache.logging.log4j</groupId> 
     <artifactId>log4j-core</artifactId> 
     <version>2.8.2</version> 
    </dependency> 

    <dependency> 
     <groupId>com.lmax</groupId> 
     <artifactId>disruptor</artifactId> 
     <version>3.3.4</version> 
    </dependency> 

をSLF4Jとlog4j2の依存関係を追加する除外を使用しますmvn依存関係を使用してください:依存関係のリストを表示し、まだよくlog4jの

[INFO] +- org.apache.kafka:kafka_2.10:jar:0.8.2.0:compile 
[INFO] | +- com.yammer.metrics:metrics-core:jar:2.2.0:compile 
[INFO] | +- org.scala-lang:scala-library:jar:2.10.4:compile 
[INFO] | +- org.apache.zookeeper:zookeeper:jar:3.4.6:compile 
[INFO] | | +- org.slf4j:slf4j-log4j12:jar:1.7.5:compile 
[INFO] | | +- log4j:log4j:jar:1.2.17:compile 

を参照してください、のは、その依存関係の除外を追加してみましょう...この男を削除します。

<dependency> 
     <groupId>org.apache.kafka</groupId> 
     <artifactId>kafka-clients</artifactId> 
     <version>0.10.1.1</version> 
     <exclusions> 
      <exclusion> 
       <groupId>log4j</groupId> 
       <artifactId>log4j</artifactId> 
      </exclusion> 
     </exclusions> 
    </dependency> 

次に、コマンドを再度実行して依存関係のリストを確認します。 OK!あなたを助けることができる明確な〜

希望:>

関連する問題