web-dev-qa-db-ja.com

POMの複数の依存関係スコープ

POMに依存関係があり、これを「提供」に設定する必要があるため、コンパイル時に含まれませんが、プロジェクト内で引き続き参照できます。テストを実行するときに同じ依存関係のスコープを「テスト」にしたいので、jarをクラスパスに手動で追加する必要はありません。これを行う方法または同様の結果を達成する方法はありますか?

これの背後にある理由は、JBOSS libディレクトリで提供されるいくつかの一般的なjarがあるため、これらを使用して、構築された戦争に対してそれらの「提供」スコープを保持したいです。ただし、コマンドラインからJUnitsを実行する場合、クラスパスに手動で追加せずに、リポジトリからjarを使用したいと思います。

前もって感謝します

36
Steve

mavenドキュメント から:

providedこれはコンパイルによく似ていますが、JDKまたはコンテナが実行時に依存関係を提供することを期待していることを示しています。たとえば、Java Enterprise EditionのWebアプリケーションを構築する場合、サーブレットAPIおよび関連するJava EE APIに依存関係を設定して、提供されるスコープにWebコンテナがこれらのクラスを提供しますこのスコープはコンパイルおよびテストのクラスパスでのみ使用でき、推移的ではありません。

これがMaven 3.0.3で動作することを確認しました。コンパイルおよびテスト中にサーブレットの依存関係を必要とするのと同じ問題がありましたが、アプリケーションサーバーディストリビューションに同梱されているため、コンパイルできませんでした。

29
fyr

これらの依存関係をテストとして、または提供されたとおりに宣言するプロファイルを使用できます。

<profiles>
    <profile>
        <id>whatever</id>
        <activation>
            <property>
                <name>env</name>
                <value>whatever</value> 
            </property>
        </activation>
        <dependencies>
            <dependency>
              <groupId>yours</groupId>
              <artifactId>yours</artifactId>
                <scope>provided</scope>
            </dependency>
        </dependencies>
    </profile>
    <profile>
        <id>test</id>
        <activation>
            <property>
                <name>env</name>
                <value>test</value> 
            </property>
        </activation>
        <dependencies>
            <dependency>
              <groupId>yours</groupId>
              <artifactId>yours</artifactId>
                <scope>test</scope>
            </dependency>
        </dependencies>
    </profile>
</profiles>

これらのプロファイルは、プロパティenvを設定することでアクティブになりますが、他の方法もあります。デフォルトのアクティベーション-そのために ここ を見てください。

6
Jan

依存関係を2回宣言し、1回は各スコープで宣言してください。 Maven 2.2.1で動作します。

同じ成果物が異なるスコープで依存関係ツリーに2回ある場合、依存関係の解決で混乱が生じますが、私はしませんthinkこれはあなたの問題ではあるはずです。

3
Andrew Spencer

同じ問題があります。同じ依存関係に2つのスコープが必要な理由は、フェーズ統合テストにあります。runrestサービスにjetty-pluginを使用し、jettyの実行中にJUnitテストを行いますが、jbossのパッケージを次のようにコンパイルします。私はすでに「resteasy-cdi」を持っていますが、突堤のサーブレットコンテナにはありません...解決策はまだ見つかりません。

2
Pavel

Maven-surefire-pluginを使用してjunitテストを実行します。提供されるスコープは、テストクラスパスでも使用できるようにします。

0
Christopher

Mavenでスコープの正確な意味を見つけてください

Mavenを参照しました http://maven.Apache.org/guides/introduction/introduction-to-dependency-mechanism.html

依存関係スコープは、依存関係の推移性を制限し、さまざまなビルドタスクに使用されるクラスパスに影響を与えるために使用されます。

使用可能なスコープは6つあります。

コンパイル:-

これはデフォルトのスコープであり、何も指定されていない場合に使用されます。コンパイルの依存関係は、プロジェクトのすべてのクラスパスで使用できます。さらに、これらの依存関係は依存プロジェクトに伝達されます。

提供:-

これはコンパイルによく似ていますが、JDKまたはコンテナーが実行時に依存関係を提供することを期待していることを示しています。たとえば、Java Enterprise EditionのWebアプリケーションを構築する場合、サーブレットAPIおよび関連するJava EE APIに依存関係を設定して、提供されるスコープにWebコンテナはこれらのクラスを提供します。このスコープはコンパイルとテストのクラスパスでのみ使用でき、推移的ではありません。

ランタイム:-

このスコープは、依存関係がコンパイルに必要ではなく、実行に必要であることを示しています。ランタイムクラスパスとテストクラスパスにはありますが、コンパイルクラスパスにはありません。

テスト:-

このスコープは、アプリケーションの通常の使用には依存関係が不要であり、テストのコンパイルおよび実行フェーズでのみ使用できることを示します。

システム:-

このスコープは、明示的に含まれているJARを提供する必要があることを除いて、提供されるスコープと似ています。アーティファクトは常に利用可能であり、リポジトリで検索されません。インポート(Maven 2.0.9以降でのみ使用可能):-このスコープは、セクションのpomタイプの依存関係でのみ使用されます。これは、指定されたPOMがそのPOMのセクションの依存関係で置き換えられる必要があることを示しています。それらが置き換えられるため、インポートのスコープを持つ依存関係は、実際には依存関係の推移性の制限に参加しません。

0
Pavan