6

他のプロジェクトでライブラリとして使用される Maven プロジェクトがあります。セットアップは非常に標準的です。src/mainライブラリ コードを使用src/testし、src/main.

fooこのライブラリに依存するプロジェクトがあるとしましょう。fooテストケースもあります。私のライブラリを使用するコードのテストを書きやすくするために、テストを書くためのサポート フレームワークfooを提供したいと思いfooます (モック環境のセットアップなど)。

このサポート コードはどこに置くことができますか?

  • src/main生産に入ることが意図されていないため、入れるべきではありません。
  • のテストからライブラリのテストへのsrc/test依存関係を作成すると、クラスパスに大量のジャンクが追加されるため、入ることができません(構成ファイル、実行されないテストなど)。foologback-test.xml

コードを新しいモジュールに入れることはできますが、 のコードと密結合しているsrc/mainため、同じプロジェクトに保持したいと思います (テスト サポート コードがパッケージのプライベート フィールドとメソッドにアクセスできるようにもします)。

また、コードはsrc/testそれにアクセスできる必要があるため、それを使用して独自の単体テストを作成できます。

src/mainこれを同じプロジェクトに保持しながら、との両方からきれいに分離するための Maven のオプションは何src/testですか? たとえば、3 番目の出力 JAR を何らかの方法で作成できますsrc/test-supportか? または、コードを入れてsrc/testから、JAR プラグインでフィルターを使用して、サポート コードのみを含める必要がありますか?

4

2 に答える 2

3

これは、Maven Jar プラグインを使用して行うことができます

Maven Jar プラグイン

Maven を使用しているため、foo で使用するライブラリを含むプロジェクトの個別のアーティファクトを切り取るだけで、次のプラグインを追加して別の jar アーティファクトを作成できます。

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

これにより、このプロジェクトに src/test ディレクトリ内のすべての 2 つ目の jar が作成されます。

テストジャー

いくつかのフィルターを使用して、その瓶の中の不要なものを切り取ることができます。

次に、このライブラリを使用するには、これを依存関係として foo に含めます。

 <dependency>
    <groupId>your.group</groupId>
    <artifactId>parent-artifact-id</artifactId>
    <version>1.0.0</version>
    <type>test-jar</type>
    <scope>test</scope>
 </dependency>

プロジェクトをさらに分離するには、よりフレームワーク的なテスト jar を使用してテストのみのプロジェクトを作成することもできます。
Maven Jar プラグインのドキュメントで、テスト クラスを含む jar を作成する方法 (推奨される方法) を参照してください。

于 2012-12-21T13:37:57.650 に答える
0

メイン JAR を通常のアーティファクトと「JUnit サポート JAR」に分割する POM フラグメントを次に示します。

<build>
    <plugins>
        <plugin>
            <artifactId>maven-jar-plugin</artifactId>
            <executions>
                <execution>
                    <id>default-jar</id>
                    <phase>package</phase>
                    <goals>
                        <goal>jar</goal>
                    </goals>
                    <configuration>
                        <archive>
                            <index>true</index>
                            <manifest>
                                <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
                            </manifest>
                        </archive>
                        <excludes>
                            <exclude>**/junit/**</exclude>
                        </excludes>
                    </configuration>
                </execution>

                <execution>
                    <id>junit-jar</id>
                    <phase>package</phase>
                    <goals>
                        <goal>jar</goal>
                    </goals>
                    <configuration>
                        <classifier>junit</classifier>
                        <archive>
                            <index>true</index>
                            <manifest>
                                <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
                            </manifest>
                        </archive>
                        <includes>
                            <include>**/junit/**</include>
                        </includes>
                    </configuration>
                </execution>

                <execution>
                    <id>test-jar</id>
                    <goals>
                        <goal>test-jar</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>

    </plugins>
</build>

簡単に言うとjunit、名前に が含まれるパッケージを探して JUnit JAR に入れ、通常のアーティファクトから除外します。

通常の瓶の座標が

<groupId>com.group</groupId>
<artifactId>foo</artifactId>

次に、以下を追加するだけで JUnit サポート コードを取得できます<classifier>junit</classifier>

<groupId>com.group</groupId>
<artifactId>foo</artifactId>
<classifier>junit</classifier>

したがって、これを使用するには、依存する POM は次のcom.group:fooようになります。

<dependency>
    <groupId>com.group</groupId>
    <artifactId>foo</artifactId>
    <version>...</version>
</dependency>
<dependency>
    <groupId>com.group</groupId>
    <artifactId>foo</artifactId>
    <version>...</version>
    <classifier>junit</classifier>
    <scope>test</scope>
</dependency>

「JUnit サポート JAR」をコンパイルするために JUnit が必要になる場合があります。その場合は、使用します

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <scope>compile</scope>
    <optional>true</optional>
</dependency>

JUnit をビルドに含めます。これにより、コンパイル時に依存関係が利用可能になりますが、他の人に漏れることはありません。

于 2013-11-22T15:58:34.930 に答える