私が試したいくつかの解決策は次のとおりですが、私の用途には適していませんでした。
1.maven-install-プラグイン
アイデアは、これをpomに追加することにより、インストールライフサイクルの一部としてインストールファイルの目標を追加することです:
<plugin>
<artifactId>maven-install-plugin</artifactId>
<version>2.5.2</version>
<executions>
<execution>
<phase>validate</phase>
<goals>
<goal>install-file</goal>
</goals>
<configuration>
<file>lib/my-custom-jar-1.0.0.jar</file>
</configuration>
</execution>
</executions>
</plugin>
[...]
<dependency>
<groupId>org.me</groupId>
<artifactId>my-custom-jar</artifactId>
<version>1.0.0</version>
</dependency>
ただし、最初の目標である でさえvalidate
、Maven は install-file が実行される前に依存関係を解決しようとします。
クリーンゴールを使用するというアイデアを見ました。厄介なことに、これは別々のコマンドを実行するmvn clean && mvn install
場合 ( ) に機能しますが、1 つの mvn コマンドで両方を実行する場合 ( mvn clean install
)、Maven が最初に依存関係を解決します。これに対する解決策はありますか?
2. マルチモジュールプロジェクト
この Stack Overflow answerに見られるアイデアは、親 pom にファイルをインストールし、子 pom に依存関係を追加することです。Maven は依存関係を個別に解決するだけなので、これは機能するはずです。
ただし、私のプロジェクトは単一のモジュールであり、この問題を解決するためだけに偽の親を作成することは、複雑すぎて醜いハックのように思えます。
3. basedir によるシステムスコープ
<dependency>
<groupId>org.me</groupId>
<artifactId>my-custom-jar</artifactId>
<version>1.0.0</version>
<scope>system</scope>
<systemPath>${basedir}/lib/my-custom-jar-1.0.0.jar</systemPath>
</dependency>
これはまさにこの種の状況のために作成されたように見えますが、実際にはシステム スコープは、プロジェクトを実行するすべてのシステムに依存関係があることを想定しているため、.war にパッケージ化されず、私のプロジェクトは非-機能的。
4.addjars-maven-plugin
ここにあるこのカスタム プラグインには、.war ファイルに .jar が含まれており、コンパイル中に pom に追加されます。
<plugin>
<groupId>com.googlecode.addjars-maven-plugin</groupId>
<artifactId>addjars-maven-plugin</artifactId>
<version>1.0.5</version>
<executions>
<execution>
<goals>
<goal>add-jars</goal>
</goals>
<configuration>
<resources>
<resource>
<directory>${basedir}/lib</directory>
<includes>
<include>**/my-custom-jar-1.0.0.jar</include>
</includes>
</resource>
</resources>
</configuration>
</execution>
</executions>
</plugin>
これは、ほとんどの通常のケースで機能します。ただし、実際の pom でカスタム .jar への依存関係を示さないため、IDE で多くのクラスが欠落するため、カスタム .jar を外部ライブラリとして手動で追加する必要があります。
これはまだややハックであり、いくつかの特殊なケースでは機能しません (たとえば、Jenkins デバッグの hpi:run はいくつかのエラーをスローします)。さらに、コードがサードパーティのプラグインに依存しないことを好みました。
5. ディレクトリ内 Maven リポジトリ
この投稿を作成した後にこの解決策を見つけましたが、とても満足しています。
mvn install-file
これは、プロジェクト内にあるリポジトリにカスタム ライブラリをインストールすることにより、結果を保存し、プロジェクトの一部として保持することを除いて、私の質問でコマンドを実行するのとほぼ同じ結果です。
このコマンドを使用して、ライブラリを事前にインストールする必要があります。
mvn org.apache.maven.plugins:maven-install-plugin:2.5.1:install-file \
-Dfile=lib/cloudfoundry-client-lib-shaded-1.0.3.jar \
-DlocalRepositoryPath=lib
これが完了すると、リポジトリが lib フォルダーに作成され、このコマンドを再度実行する必要がなくなります。
pom でこのリポジトリを使用することを示します。
<repository>
<id>Local repository</id>
<url>file://${basedir}/lib</url>
</repository>
[...]
<dependency>
<groupId>org.me</groupId>
<artifactId>my-custom-jar</artifactId>
<version>1.0.0</version>
</dependency>
このソリューションでは、SCM に大量の余分なフォルダーをコミットする必要がありますが、それは私にとって扱いやすい欠点であり、これには満足しています。