web-dev-qa-db-ja.com

依存関係テストjarをMavenプロジェクトのデプロイメントに含めるにはどうすればよいですか?

foo-webグループの下に、foocom.exampleの2つのプロジェクトがあります。 foo-webfooに依存します。

外部サービスに依存せずにアプリケーションのUI部分を開発できるように、ダミーのDAOがfooに実装されました(静的データを返すため、データベースなどに接続する必要はありません)。

ダミークラスをsrc/test/Javaに移動する必要がありました。これは、それらがfoo.jarでWebプロジェクトから構築された戦争にデプロイされないことを意味します。私はこれらの指示をMavenサイトで見つけましたが、それらは私には機能していないようです。

foopom.xmlにあるもの:

        <plugin>
          <artifactId>maven-jar-plugin</artifactId>
          <executions>
            <execution>
              <id>test-jar</id>
              <phase>test-compile</phase>
              <goals>
                <goal>test-jar</goal>
              </goals>
            </execution>
          </executions>
        </plugin>

mvn installfoo-webを実行すると、fooのターゲットで、foo-1.0.0-SNAPSHOT.jarfoo-1.0.0-SNAPSHOT-tests.jarの2つのjarが取得されます。どちらもローカルのMavenリポジトリに正常にインストールされます。

以前、foo-web依存関係は次のようになりました。

<dependency>
    <groupId>com.example</groupId>
    <artifactId>foo</artifactId>
    <version>1.0.0-SNAPSHOT</version>
</dependency>

そして、それは戦争でfoo-1.0.0-SNAPSHOT.jarの展開を引き起こすでしょう。さて、-tests jarもデプロイしたいのですが、できれば「ローカル」プロファイルのみにデプロイしてください。

私はさまざまな方法でこれを試みました:

<profile>
    <id>local</id>
    <dependencies>
        <dependency>
            <groupId>com.example</groupId>
            <artifactId>foo</artifactId>
            <version>1.0.0-SNAPSHOT</version>
            <type>test-jar</type>
        </dependency>
    </dependencies>
</profile>

これにより、ソースjarは異なる名前com.example-foo.jarでデプロイされ、テストjarはデプロイされません。依存関係で<classifier>の代わりに<type>を使用してみましたが、それでも同じことができます。上記の依存関係をプロファイルの外で(他の依存関係と一緒に)使用してみましたが、それでも同じように動作します。

<type>を(他の依存関係を追加せずに)メインの依存関係に追加すると、テストjarが(上記と同じ名前で)デプロイされますが、ソースは当然デプロイされません。

ドキュメントに記載されているものとの唯一の違いは、テストの依存関係に対してスコープが指定されていないという事実です。 testスコープでのみ機能しますか?どういうわけか、テストクラスを異なる方法で展開できますか。

質問がやや複雑であることがわかっています。明確にすることができるものがあれば教えてください。

ありがとう!


更新:

いくつかの方法で試しましたが、まだ機能しません。

fooプロジェクト(メインWebプロジェクトではなく、依存関係)のmaven-jar-pluginに別の実行を追加しました。ここでは、mavenにメインjarと同じjarのテストクラスをコンパイルさせます。別の分類子で大きなバンドルを参照します。私はそれを動作させることができませんでした:

<execution>
  <id>local-build</id>
  <phase>package</phase>
  <goals>
    <goal>jar</goal>
  </goals>
  <configuration>
    <classifier>batman</classifier>
    <directory>${basedir}/src/test/Java</directory> <!-- tried several variations here -->
    <includes>
        <include>**</include>
    </includes>
  </configuration>
</execution>

Jarはbatman分類子を使用して生成されましたが、jarゴールにテストクラスを含める方法を見つけることができませんでした。

これを行うと、これはtest-jar type/tests classifier/testスコープ関係に依存しないことがわかりました。メインのjar以外に作成している新しいjarを指定しようとすると、-tests jarを含めようとしたときと同じ動作になりました。ローカルのMavenリポジトリを確認しましたが、依存プロジェクトのすべてのjarが正常にインストールされているため、問題はメインプロジェクトの依存関係の解決です。

tl; dr

複数の分類子に同じ依存関係を含めることができるかどうかは、すべてが問題になります。私が今まで見たものから、答えはノーです-異なる分類子で同じ依存関係を複数回指定すると、常にcom.example-foo jarを取得します。

35
Alex Ciminian

最初のモジュールでmaven pomファイルを構成する方が良い

<project>
    <groupId>com.example</groupId>
    <artifactId>foo</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <packaging>jar</packaging>
    <build>
        <plugins>
            ...
            <plugin>
                <groupId>org.Apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <executions>
                    <execution>
                        <goals>
                            <goal>test-jar</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

この後、mvn install/releaseはアーティファクトをデプロイしますfoo-1.0.0-SNAPSHOT-tests.jar

次に、分類器を使用してテストjarへの依存関係を構成します(他の応答で提案されているように)

<dependency>
    <groupId>com.example</groupId>
    <artifactId>foo</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <type>test-jar</type>
    <!-- uncomment if needed in test scope only
         <scope>test</scope>
    -->
</dependency>
48
raisercostin

test-jar as typeとしてclassifierの代わりにtypeを使用しましたが、おそらくtest-jar ...しかし、次のことを試しましたか?

<dependency>
    <groupId>com.example</groupId>
    <artifactId>foo</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <classifier>tests</classifier>
    <scope>test</scope>
</dependency>
4
Brambo

私はパーティーに少し遅れていますが、これが誰かの助けになることを願っています:同じ依存関係の複数のtypesを含めることができます。プロジェクトがcommon-artifact-1.0.jarに依存しており、テストjar common-artifact-1.0-tests.jarもあると仮定します。

これを行うことにより、jarとテストjarの両方をインポートできます。

<dependencies>
    <dependency>
        <groupId>my.corp</groupId>
        <artifactId>common-artifact</artifactId>
        <version>1.0</version>
        <type>jar</type>
        <scope>compile</scope>
    </dependency>
    <dependency>
        <groupId>my.copr</groupId>
        <artifactId>common-artifact</artifactId>
        <version>1.0</version>
        <type>test-jar</type>
        <scope>test</scope> <!-- the "compile" scope also works here -->
    </dependency>
</dependencies>
2
Jeronimo Backes

私が見つけた1つの実用的な解決策は、build-helper pluginを使用してアセンブリ内のテストフォルダを取得することでしたローカルプロファイルの構築。これは依存プロジェクトにあります:

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <!-- used to package the dummy daos when building 
         with the local profile -->
    <artifactId>build-helper-maven-plugin</artifactId>
    <executions>
        <execution>
            <phase>generate-sources</phase>
            <goals>
                <goal>add-source</goal>
            </goals>
            <configuration>
                <sources>
                    <source>${extra.sources.dir}</source>
                </sources>
            </configuration>
        </execution>
    </executions>
</plugin>

また、依存プロジェクトのプロファイル:

<profile>
    <id>local</id>
    <properties>
        <env.resources.dir>src/test/resources</env.resources.dir>
        <extra.sources.dir>src/test/Java</extra.sources.dir>
    </properties>
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.8.1</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>org.springframework.test</artifactId>
            <scope>compile</scope>
        </dependency>
    </dependencies>
</profile>

このように、メインプロジェクトのPOMは変更されず、ローカルでビルドするときにスタブがデプロイされます。

ただし、複数の分類子を展開できるかどうかはまだわかりません。 :)

1
Alex Ciminian

実行時にjarが必要な場合は、次のトリックも試してください。これは、コンパイル時に依存関係をターゲットフォルダーに直接コピーするだけです。パッケージが作成されるときにそれらが含まれることを期待しています...私はこれを自分でテストしていません

<plugin>
  <groupId>org.Apache.maven.plugins</groupId>
  <artifactId>maven-dependency-plugin</artifactId>
  <executions>
    <execution>             
      <id>copy-dependencies</id>
      <phase>compile</phase>
      <goals>
        <goal>copy-dependencies</goal>
      </goals>
      <configuration>
        <artifactSet>
          <includes>
        <include>com.example:foo</include>
          </includes>
        </artifactSet>
        <outputDirectory>target/dependencies</outputDirectory>
      </configuration>
    </execution>
  </executions>
</plugin> 
0
Brambo