一般的なアプローチの問題
インターネット上で見つかるほとんどの回答は、ローカルリポジトリに依存関係をインストールするか、「システム」スコープをに指定してpom
、依存関係をプロジェクトのソースに配布することをお勧めします。しかし、これらのソリューションはどちらも実際には欠陥があります。
「ローカルリポジトリへのインストール」アプローチを適用すべきでない理由
ローカルリポジトリに依存関係をインストールすると、依存関係はそのまま残ります。ディストリビューションアーティファクトは、このリポジトリにアクセスできる限り問題なく動作します。問題は、ほとんどの場合、このリポジトリがローカルマシンにあるため、他のマシンでこの依存関係を解決する方法がないためです。明らかに、アーティファクトを特定のマシンに依存させることは、物事を処理する方法ではありません。それ以外の場合、この依存関係は、そのプロジェクトで動作するすべてのマシンにローカルにインストールする必要がありますが、これはさらに良い方法ではありません。
「システムスコープ」アプローチを適用すべきでない理由
「システムスコープ」アプローチで依存するjarは、リポジトリにインストールされたり、ターゲットパッケージにアタッチされたりしません。そのため、配布パッケージには、使用時にその依存関係を解決する方法がありません。システムスコープの使用が非推奨になった理由は、私が信じていたからです。とにかく、廃止予定の機能に依存したくありません。
静的なプロジェクト内リポジトリソリューション
これをあなたに入れた後pom
:
<repository>
<id>repo</id>
<releases>
<enabled>true</enabled>
<checksumPolicy>ignore</checksumPolicy>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
<url>file://${project.basedir}/repo</url>
</repository>
フォームのグループIDを持つ各アーティファクトについて、アーティファクトのx.y.z
検索でプロジェクトディレクトリ内の次の場所が含まれます。
repo/
| - x/
| | - y/
| | | - z/
| | | | - ${artifactId}/
| | | | | - ${version}/
| | | | | | - ${artifactId}-${version}.jar
詳細については、このブログ投稿をご覧ください。
Mavenを使用してプロジェクトリポジトリにインストールする
この構造を手動で作成する代わりに、Mavenプラグインを使用して、jarをアーティファクトとしてインストールすることをお勧めします。したがって、repo
フォルダー内のプロジェクト内リポジトリにアーティファクトをインストールするには、次のコマンドを実行します。
mvn install:install-file -DlocalRepositoryPath=repo -DcreateChecksum=true -Dpackaging=jar -Dfile=[your-jar] -DgroupId=[...] -DartifactId=[...] -Dversion=[...]
このアプローチを選択すると、リポジトリ宣言pom
を次のように簡略化できます。
<repository>
<id>repo</id>
<url>file://${project.basedir}/repo</url>
</repository>
ヘルパースクリプト
各libに対してインストールコマンドを実行するのはちょっと面倒で間違いも起こりやすいので、すべてのjarをフォルダーからプロジェクトリポジトリに自動的にインストールし、同時にすべてのメタデータ(groupId、artifactIdなど)を自動的に解決するユーティリティスクリプトを作成しましたlib
ファイルの名前。このスクリプトでは、依存関係のxmlも出力され、にコピーして貼り付けることができますpom
。
ターゲットパッケージに依存関係を含める
プロジェクト内のリポジトリを作成すると、プロジェクトの依存関係をそのソースと一緒に配布する問題が解決されますが、それ以降、プロジェクトのターゲットアーティファクトは非公開のjarに依存するため、インストールするときにそれをリポジトリに置くと、解決できない依存関係があります。
この問題を解決するには、これらの依存関係をターゲットパッケージに含めることをお勧めします。これは、AssemblyプラグインまたはOneJarプラグインを使用して行うことができます。OneJarに関する公式のドキュメントは簡単に理解できます。