8

私が取り組んでいるプロジェクトは、Mavenで構築された複数のモジュールで構成されています。一部のモジュールのテストコードは、他のモジュールのテストコードに依存しています。これらの依存関係は次のように宣言されています。

依存関係モジュールの場合:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <version>2.2</version>
    <executions>
        <execution>
            <goals>
                <goal>test-jar</goal>
            </goals>
        </execution>
    </executions>
</plugin>

前のモジュールに依存しているモジュールの場合:

<dependency>
    <groupId>${project.groupId}</groupId>
    <artifactId>themodulename</artifactId>
    <version>${project.version}</version>
    <type>test-jar</type>
    <scope>test</scope>
</dependency>

この構成を使用すると、Mavenインストールフェーズを正常に実行できます。ただし、テストjarファイルの依存関係を解決できないため、コンパイルフェーズまたはテストフェーズを実行しようとすると失敗します。

test-jarの目標を見ると、パッケージフェーズ中にデフォルトで実行されるように構成されているようです。これが問題の原因だと思います。

次に、最初の構成を次のように変更して、コンパイルフェーズ中にこの目標を強制的に実行しようとしました。

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <version>2.2</version>
    <executions>
        <execution>
            <phase>compile</phase>
            <goals>
                <goal>test-jar</goal>
            </goals>
        </execution>
    </executions>
</plugin>

デバッグログを見ると、コンパイルフェーズで目標が実行されていることがわかりますが、これも次のようになります。

[WARNING] JAR will be empty - no content was marked for inclusion!

インクルードを**/*に構成しようとし、デフォルトのtestClassesDirectoryが正しいものに設定されていることを確認しましたが、それでも同じ警告が表示されます。

コンパイルフェーズの実行後にtest-classesフォルダーが存在しなかったことがわかりました。これは正常に見えますが、テストフェーズの実行後に存在し、ファイルが含まれていても、「JARは空になります」という警告が表示されます。 。

コンパイルまたはテストフェーズを正常に実行できるように、この構成を修正することについて誰かが考えていますか?

4

3 に答える 3

6

これらのプラグイン構成はあなたのために働くと思います。

リソースの準備とコンパイルでスキップをfalseに上書きするだけです。

  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-resources-plugin</artifactId>
    <executions>
      <execution>
        <id>default-testResources</id>
        <configuration>
          <skip>false</skip>
        </configuration>
        <phase>process-test-resources</phase>
        <goals>
          <goal>testResources</goal>
        </goals>
      </execution>
    </executions>
  </plugin>
  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <executions>
      <execution>
        <id>default-testCompile</id>
        <configuration>
          <skip>false</skip>
        </configuration>
        <phase>test-compile</phase>
        <goals>
          <goal>testCompile</goal>
        </goals>
      </execution>
    </executions>
  </plugin>
  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <executions>
      <execution>
        <configuration>
          <skip>false</skip>
        </configuration>
        <goals>
          <goal>test-jar</goal>
        </goals>
      </execution>
    </executions>
  </plugin>
于 2013-09-04T02:56:10.143 に答える
4

問題は、マルチモジュールビルドでの依存関係の解決にあります。特にテストコードとは関係ありません。

私はまさにこの設定をしています。共通モジュールには、共有テストコード(テストダブルとモックなど)とともにランタイムコードが含まれています。テストコードは、他のモジュールのテストで使用されます。それは私たちにとって非常にうまく機能します。

「mvncompile」はランタイムコードのみをコンパイルします。

親レベル(reactorビルド)で「mvntest-compile」、「mvn test」、または「mvn package」を実行すると、すべてが完全に機能します。原子炉はそれをすべて整理することができます。

モジュールレベルでビルドを実行する場合、そのモジュールのすべての依存関係はリポジトリに存在する必要があります。これは、依存するモジュールごとに「mvninstall」を事前に実行しておく必要があることを意味します。このルールは、通常の依存関係とテスト依存関係の両方に等しく適用されます。

あなたがそれが親へのリンクをたどり、他のモジュールへと続くことを望んでいたなら、私はあなたを失望させなければなりません。親リンクは、pomの共通設定を継承するためにのみ使用され、依存関係の解決には使用されません。

個人的には、ほとんどの場合、親から完全なリアクタービルドを行います。以前に親レベルでmvninstallを実行したことがあり、他のモジュールが変更されていないことがわかっている場合にのみ、個別のモジュールビルドを実行します。

お役に立てば幸いです。

于 2012-08-24T09:48:01.473 に答える
1

テストは1つのモジュールの一部にすぎないと私は強く信じています。他のモジュールのテストに依存しないでください。テストを更新して動作を変えるとどうなるかを予測するのは非常に困難です。

共通のテストデータまたは共通のテストクラスを共有する必要がある場合は、その共有テストソースを使用して別のモジュールを作成することをお勧めします。次に、すべてのテストがスコープテスト付きの共有test-jarに依存するようにします。

+-- MyProject
+-- common-test-util
|   +-- src
|   |    +-- main
|   |        +-- java
|   +-- pom.xml
+-- moduleA
|   +-- src
|   |    +-- main
|   |    |   +-- java
|   |    +-- test
|   |        +-- java
|   +-- pom.xml
+-- moduleB
|   +-- src
|   |    +-- main
|   |    |   +-- java
|   |    +-- test
|   |        +-- java
|   +-- pom.xml
+-- pom.xml

にのみ依存していることを確認してください。そうすればcommon-test-util<scope>test</scope>電話をかけることができます。

mvn test

トップレベルで、すべてのテストが実行されます。

于 2012-08-24T08:02:02.310 に答える