6

私はこれを尋ねる必要はないと思いましたが、私は何の進歩もありません。

この質問の解決策: Mavenスコープをivyによってivy構成にマップする方法は、実際には質問に対処しますが、理論的な部分です。

私はこの構成を持っています:

<conf name="compile"  description="???" />
<conf name="runtime"  description="???" extends="compile" />
<conf name="test"     description="???" extends="runtime" />
<conf name="provided" description="???" />

私がこの依存関係を持っていると仮定します:

<dependency org="org.apache.tomcat" name="servlet-api" rev="6.0.16" transitive="false" />

私が欲しいのは、ivy:retrieveを呼び出してライブラリをバンドルする前に.war libディレクトリにコピーするとき、すべてのランタイムをコピーする(そして暗黙的にコンパイルする)だけで、servlet-apiはコピーしないことです。

では、ivy:retrieveの使い方は?

<ivy:retrieve conf="WHAT_TO_PUT_HERE" />

および依存関係を構成する方法:

<dependency conf="WHAT_IS_THE_CONF_MAPPING" org="org.apache.tomcat" name="servlet-api" rev="6.0.16" transitive="false" />

私はここで頭打ちになっているので、助けていただければ幸いです。

servlet-apiのivy.xmlがアーティファクトを次のように定義していることを知っている

conf="master"

したがって、問題は、提供されたMavenのスコープを提供されたIVYの構成に「実際に」マップする方法だと思います。

4

1 に答える 1

8

これは、依存関係をローカルの「提供された」構成にマップする方法です。

<dependency org="org.apache.tomcat" name="servlet-api" rev="6.0.16" conf="provided->master"/>

構成マッピングは次のように機能します。

provided->master
   ^        ^
   |        |
 Local    Remote
 config   config

回答で説明されているように、特別な「マスター」構成には、このモジュール自体によって公開されたアーティファクトのみが含まれ、推移的な依存関係はありません。

これは、「transitive=false」属性が不要であることを意味します。

アップデート

構成をどのように使用するかはあなた次第です。最初のオプションはより単純ですが、構成レポートがクラスパスの内容と一致するため、2番目のアプローチを好みます

オプション1

次のように単一のクラスパスを作成できます。

<ivy:cachepath pathid="compile.path" conf="compile,provided"/>

これは、次のようにjavacタスクで使用できます。

<javac ... classpathref="compile.path">
..

オプション2

または、構成とクラスパスの間に1対1のマッピングを設定することをお勧めします。

<ivy:cachepath pathid="compile.path" conf="compile"/>
<ivy:cachepath pathid="provide.path" conf="provided"/>

後者のアプローチの問題は、javacタスクでクラスパスの使用法を次のように明示的に指定する必要があることです。

<javac ...
   <classpath>
      <path refid="compile.path"/>
      <path refid="provided.path"/>
   </classpath>

これは、この特別に提供されたスコープの使用方法を明確に説明していると思いますが、実際にはあなた次第です。

于 2012-07-30T22:53:25.290 に答える