foo-web
グループの下に、foo
とcom.example
の2つのプロジェクトがあります。 foo-web
はfoo
に依存します。
外部サービスに依存せずにアプリケーションのUI部分を開発できるように、ダミーのDAOがfoo
に実装されました(静的データを返すため、データベースなどに接続する必要はありません)。
ダミークラスをsrc/test/Java
に移動する必要がありました。これは、それらがfoo.jar
でWebプロジェクトから構築された戦争にデプロイされないことを意味します。私はこれらの指示をMavenサイトで見つけましたが、それらは私には機能していないようです。
foo
のpom.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 install
でfoo-web
を実行すると、foo
のターゲットで、foo-1.0.0-SNAPSHOT.jar
とfoo-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が正常にインストールされているため、問題はメインプロジェクトの依存関係の解決です。
複数の分類子に同じ依存関係を含めることができるかどうかは、すべてが問題になります。私が今まで見たものから、答えはノーです-異なる分類子で同じ依存関係を複数回指定すると、常にcom.example-foo
jarを取得します。
最初のモジュールで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>
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>
私はパーティーに少し遅れていますが、これが誰かの助けになることを願っています:同じ依存関係の複数の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>
私が見つけた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は変更されず、ローカルでビルドするときにスタブがデプロイされます。
ただし、複数の分類子を展開できるかどうかはまだわかりません。 :)
実行時に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>