【JFrog】maven用のプライベートリポジトリをSonatype Nexus Repository ManagerからJFrog Artifactoryに移行した話

# やること

|ASIS|TOBE|
|---|---|
|![2023RepoLogo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/377231/4faae23b-3a91-9fc7-ddb7-f467829d6bd2.png)|![logo-jfrog-artifactory-885x240-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/377231/a1380d53-d5a3-4455-94f2-25e4688a2188.png)|


Maven用のプライベートリポジトリの移行を行います。

# 背景
会社の都合です。
Nexus用のサーバがEOLになるためです。
これを機にJFrogに移行したいとの要望がありました。

# 事前準備

あらかじめNexusを使ってビルドします。その際に作成されたローカルリポジトリ`~/.m2/repository`を`Desktop`あたりに逃しておきます。この中のアーティファクトをこれからJFrogへアップロードしていきます。

# STEP1:JFrog Artifactoryへリポジトリを作成
まずログインするためのアカウント登録とプライベートリポジトリの登録を行います。

JFrog ArtifactoryへログインしAPI KEYを確認します

![スクリーンショット 2023-11-06 23.31.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/377231/89c3577f-77c1-3d60-27e3-3853a7c60b09.png)


# 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で指定している場合はこのように設定します。
２０２１年以降、セントラルの取得先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まで表示してくれないのと、必要最低限のアップロードにしたかったのでこのアプローチでプライベートリポジトリの移行を行いました。