やること
ASIS | TOBE |
---|---|
![]() |
![]() |
Maven用のプライベートリポジトリの移行を行います。
背景
会社の都合です。
Nexus用のサーバがEOLになるためです。
これを機にJFrogに移行したいとの要望がありました。
事前準備
あらかじめNexusを使ってビルドします。その際に作成されたローカルリポジトリ~/.m2/repository
をDesktop
あたりに逃しておきます。この中のアーティファクトをこれからJFrogへアップロードしていきます。
STEP1:JFrog Artifactoryへリポジトリを作成
まずログインするためのアカウント登録とプライベートリポジトリの登録を行います。
JFrog ArtifactoryへログインしAPI KEYを確認します
STEP2:settings.xmlの設定
settings.xmlに以下を追加します
<servers>
<server>
<id>リポジトリID</id>
<username>あなたのアカウント</username>
<password>あなたのAPI KEY</password>
</server>
</servers>
これが作成したアーティファクトをアップロードする際の認証の役割を果たします。
<mirrors>
<mirror>
<id>central-mirror</id>
<mirrorOf>central</mirrorOf>
<url>https://repo.maven.apache.org/maven2/</url>
</mirror>
<mirror>
<id>何でも</id>
<mirrorOf>ミラーの名前</mirrorOf>
<url>https://artifactoryのリポジトリURL</url>
</mirror>
</mirrors>
mirrorで指定している場合はこのように設定します。
2021年以降、セントラルの取得先URLにデフォルトのhttpを指定できなくなりました。なのでセントラルの取得先URL(https)をここに指定します。プライベートなアーティファクトの取得先はhttps://artifactoryのリポジトリURL
になります。
<distributionManagement>
<repository>
<id>リポジトリID</id>
<name>何でも</name>
<url>作ったアーティファクトJARのアップロード先</url>
</repository>
</distributionManagement>
<distributionManagement>
を記載すればビルドしたときにできたJARとPOMをどのリポジトリにアップロードするかを指定できます。
STEP3:ビルドとアーティファクトのアップロード
ビルドしてみましょう。
mvn clean package install -Dmaven.javadoc.skip=true -Dmaven.test.skip=true -s settings.xml
-s settings.xml
を指定すればデフォルトの~/.m2/settings.xml
ではなく、POMと同ディレクトリに置いたsettings.xml
を利用することができます。
この時点で
Downloading: https://artifactory/xxxx/yyyy.pom
Downloading: https://repo.maven.apache.org/zzzz.pom
のように指定したプライベートリポジトリとmaven-centralからアーティファクトを取得しようとします。
サードパーティ製のアーティファクトはhttps://repo.maven.apache.org/
からダウンロードされます。
まだこの時点でJFrog Artiact上に何もアーティファクトを置いていないので
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 13.399 s
[INFO] Finished at: 2023-10-27T14:59:28+09:00
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal on project ...... Could not find artifact (アーティファクト) in リポジトリ名
みたいなエラーが出ます。
(アーティファクト)
がなくてビルドできないと言われているので、これからそのないと言われているJARまたはPOMファイルをJFrog Artifactのリポジトリにアップロードします。
ここで使用するのがあらかじめ事前準備で退避しておいたrepository
ディレクトリです。
まず
https://jfrog.com/ja/getcli/
でJFrogのためのCLIをインストールします。
デスクトップに退避しておいたrepository
ディレクトリに移動したら
jfrog rt upload <アーティファクトのパス> <Jfrog Artifactryのリポジトリ名>
でアーティファクト(JAR・POM)をコマンドラインからアップロードします。
そしてローカルリポジトリ~/.m2/repository
(アーティファクトを取得できなかった履歴が残っているから)を削除してから再度ビルドし、先ほどエラーで指摘されたアーティファクトが正常にJfrogからローカルへダウンロードされ、エラーの内容が変わったことを確認します。
同様に、ビルドが成功するまで
- ビルド
- エラー表示
- エラーで指摘されたアーティファクト(JAR・POM)をCLIでアップロード
-
~/.m2/repository
を削除
を繰り返します。私の場合はアップロードすべきアーティファクトが多いのでPythonでこの繰り返しを自動化しました。mavenのtreeコマンドで依存アーティファクトの一覧を取得してまとめてアップロードするのも別の方法として考えたのですが、treeコマンドはparentまで表示してくれないのと、必要最低限のアップロードにしたかったのでこのアプローチでプライベートリポジトリの移行を行いました。