MavenWARの依存関係


82

私は受け入れテスト用のプロジェクトを書いていますが、さまざまな理由から、これはWARとしてパッケージ化されている別のプロジェクトに依存しています。maven-dependency-pluginを使用してWARをアンパックできましたが、プロジェクトにアンパックWEB-INF/lib/*.jarWEB-INF/classes/*含めたり、クラスパスに含めたりできないため、ビルドが失敗します。これらのファイルをクラスパスに含める方法はありますか、それともWARに依存するより良い方法はありますか?

どうもありがとう。

回答:


115

maven-war-plugin 2.1-alpha-2以降、別のオプションがあります。WARプロジェクトの場合:

<plugin>
    <artifactId>maven-war-plugin</artifactId>
    <version>2.1.1</version>
    <configuration>
        <attachClasses>true</attachClasses>
    </configuration>
</plugin>

これにより、受け入れテストプロジェクトで使用できるクラスアーティファクトが作成されます。

<dependency>
    <groupId>your-group-id</groupId>
    <artifactId>your-artifact-id</artifactId>
    <version>your-version</version>
    <classifier>classes</classifier>
</dependency>

6
私にとってこれに関する唯一の問題は、推移的な依存関係を
引き込ま

1
ええ、このヒントをありがとう:)それは部分的に私のために働いた。Mavenコマンドラインを使用すると、すべて問題ありません。maven in eclipse(m2e)では、戦争中のクラスを参照するテストのビルドも問題ありませんが、テスト(junit)を実行しようとすると、m2eワークスペースの解決をオフにする必要があります。それ以外の場合、junitの実行により、参照されている戦争のクラスに対してClassNotFoundExceptionがスローされます。どういうわけか、warプロジェクトはプロジェクトのビルドパスのmaven依存関係ライブラリの下にリストされていますが、それらはjunit実行クラスパスに含まれていません。何か案が?
ガンダルフ

1
プロジェクトの依存関係として依存関係のpomを追加して、推移的な依存関係を取得できます。したがって、クラスとpomに依存することになります
Jonatan Cloutier 2015

このプラグインはpomの<build>設定に入る必要があることに注意してください。
MichaelCleverly 2015年

私の場合、src / main / resources / *が必要でしたが、それらは「-classes.jar」にも含まれています。
ジョナスベルリン

24

実際、設計上、Mavenはプロジェクトの依存関係として宣言された戦争の推移的な依存関係を解決しません。そこそれについての問題、実際にはMNG-1991は、それはMavenの2.xの中では解決できないだろうと私はことをわからないオーバーレイがこの問題を回避できるようにする場合、私は知りません。提案された解決策についての私の理解は、たとえばpomタイプのプロジェクトで依存関係を複製することです。


(編集:もう少し掘り下げた後、私はこのスレッドで私が以下に引用している何か面白いものを見つけました:

私は先月、Maven戦争プラグインの戦争オーバーレイ機能を多用するAppFuseプロジェクトの開発を支援してきました。それは本当に気の利いた機能です!

戦争オーバーレイで最大のパワーを得るには、プロジェクトが戦争アーティファクトを本格的な依存関係として使用できるようにするWarpathプラグインを開発しました。簡単に言うと:

1)war依存関係アーティファクトの/ WEB-INF / classesディレクトリの内容は、通常のコンパイルなどのタスクのためにプロジェクトのクラスパスに含めることができます。
2)戦争依存関係アーティファクトからの推移的な依存関係は、コンパイルや耳などの他のプラグインで使用できるようになります。したがって、スキニー戦争を作成するときにすべての依存関係を含める必要はありません。

このプラグインは、過去数か月間AppFuseプロジェクトで積極的に使用されており、使用可能で安定している段階にあると感じています。戦争プラグインチームは、戦争プラグイン内にウォーパス機能を含めることに関心がありますか?それをホストするのに最も自然な場所のようです。

したがって、私はそれについての経験はありませんが、Maven Warpathプラグインは実際には見栄えがよくシンプルで、中央リポジトリで利用できます。これを使用するには、pom.xmlファイルに次のプラグイン構成要素を含めます。

[...]
<build>
  <plugins>
    <plugin>
      <groupId>org.appfuse</groupId>
      <artifactId>maven-warpath-plugin</artifactId>
      <version>1.0-SNAPSHOT</version>
      <extensions>true</extensions>
      <executions>
        <execution>
          <goals>
            <goal>add-classes</goal>
          </goals>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>
[...]

そして、クラスパスに含めたいwar依存関係をwarpathタイプの依存関係として追加します。

[...]
<dependencies>
  <dependency>
    <groupId>org.appfuse</groupId>
    <artifactId>appfuse-web</artifactId>
    <version>2.0</version>
    <type>war</type>
  </dependency>
  <dependency>
    <groupId>org.appfuse</groupId>
    <artifactId>appfuse-web</artifactId>
    <version>2.0</version>
    <type>warpath</type>
  </dependency>
</dependencies>
[...]

warとwarpathの両方の依存関係タイプが必要です。warタイプはMavenwarプラグインがwarオーバーレイを実行するために使用し、warpathタイプはWarpathプラグインがプロジェクトクラスパスに含めるアーティファクトの正しいリストを決定するために使用します。

試してみます。)


1
Pascal、私のプロジェクトでは、異なるサーバーで統合テストを実行するための個別のモジュールがあります(1つのサーバーの各モジュール)。これらのテストモジュールにはテストクラスがあり、戦争とオーバーレイの依存関係を使用します。私は素晴らしい仕事をしています。
cetnar 2009年

さて、私が書いたように、私は確信が持てなかったので、そのフィードバックに感謝します、知っておくのは良いことです。戦争のJavaクラスだけでなく、戦争の推移的な依存関係で機能することを確認できますか?
Pascal Thivent 2009年

わかりました、ありがとう。私はそれが今どのように機能するかを理解しています(重要な部分はあなたの2番目の文です:あなたのテストプロジェクトはパッケージング戦争も持っている必要があります)。
パスカルティベント2009年

1
私はこのプラグインを持っている問題は、それがm2eclipseによってサポートされていないということです:maven.40175.n5.nabble.com/...
ミラノ

このプラグインは、Mavenリリースプラグインとアセンブリプラグインの両方を壊します。これらは両方とも、warpathプラグインを使用するWARの依存関係を解決しようとするため、Mavenはtype = warpath依存関係を解決できないと言って壊れます。残念ながら機能しません。
HDave 2010

14

オーバーレイを使用します。まず、テストプロジェクトにはパッケージも必要warです。

テストする戦争プロジェクトの依存関係を宣言します。

<dependency>
    <groupId>${project.groupId}</groupId>
    <artifactId>your-project-arftifactId</artifactId>
    <version>${project.version}</version>  
    <type>war</type>
    <scope>test</scope>
</dependency>

次に、maven-war-pluginオーバーレイを構成します。

<plugins>
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-war-plugin</artifactId>
        <configuration>
            <webResources>
                <resource>
                    <directory>${basedir}/src/main/webresources</directory>
                    <filtering>true</filtering>
                </resource>
            </webResources>
            <overlays>
                <overlay/>
                <overlay>
                    <groupId>your.group</groupId>
                    <artifactId>your-project-artifactId</artifactId>
                </overlay>
            </overlays>
        </configuration>
    </plugin>

上記のテストプロジェクトの例では、webresources構成ファイル(conxtextなど)を上書きします。

編集:このソリューションはMaven3ではテストされていません。


1
テストする前に、これに反対票を投じました。これがMaven3を使用しているためかどうかはわかりませんが、実際、/ classesフォルダーと/ libフォルダーの両方が複数のWAR依存関係を介して推移的に含まれています。繰り返しますが、投票して申し訳ありません。どうやら、これは「正しい」答えです。
HDave 2010

4

良い点、ジャスティン。それは私が実際に私の問題を解決するようになりました。つまり、戦争をアセンブリに含め、そのすべての推移的な依存関係を含めました。アセンブリプラグインがそのgroupId / artefactIdによって参照されるjarを検出しないため、提案したようにwar-dependencyを 'jar'として複製できませんでしたが、

  • タイプpomとして戦争依存関係を複製する

動作します!戦争とその推移的な依存関係は、アセンブリに含まれていません。(現在も表示されている)pomファイルを除外するには、次のような除外要素を追加する必要がありました。

  <excludes>
    <exclude>*:pom</exclude>
  </excludes>

私のassembly.xmlファイルに。

これは、このスレッドの元の質問の回避策にもなる可能性があると思います。


-1

warプロジェクトへの依存関係をjar依存関係としてリストすると、必要なjar /リソースを取得しているように見えます。Maven 2.2 + m2eclipseを使用しています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.