【Scala】SBT ~ リポジトリ先を変更・追加するには ~

■ はじめに

https://dk521123.hatenablog.com/entry/2023/12/26/012343
https://dk521123.hatenablog.com/entry/2024/01/11/233802

で、AWS CodeArtifact を使って、クローズされた
Mavenのリポジトリ (と pip(PyPI; The Python Package Index))を考えている。
その際に、sbt を使おうと思っているのだが、AWS公式ドキュメント(※)によると
サポートはされていそうなのだが、あんまり参考になるサイトがなかった。

そこで、今回は、独自のMavenリポジトリとして「Sonatype Nexus」を使って
sbt で リポジトリ先の変更・追加する方法を調査してみた

AWS公式ドキュメント「AWS CodeArtifact」
https://docs.aws.amazon.com/ja_jp/codeartifact/latest/ug/using-maven.html

より抜粋
~~~~~~~~~~~~~~~~~~~
Mavenリポジトリ形式は Java、Kotlin、Scala、Clojureなど、
さまざまな言語で使用されています。
Maven、Gradle、Scala SBT、Apache Ivy、Leiningenなど、
さまざまなビルドツールでサポートされています。
~~~~~~~~~~~~~~~~~~~

目次

【1】リポジトリ先に関するSBT's Tips
 1)Proxy Repositories
 2)resolvers
【2】Sonatype Nexus
 1)サポートリポジトリ
【3】Sonatype Nexusを使った実験
 0)前提条件
 1)Sonatype Nexus の構築
 2)Sonatype Nexus の Web UI へアクセス
 3)sbt クライアント側の設定
 4)sbt 実行

【1】リポジトリ先に関するSBT's Tips

* 「2)resolvers」については、
 今回、使用していないが取り上げておく。

参考文献
https://alvinalexander.com/scala/how-configure-sbt-custom-repositories-resolvers/

1)Proxy Repositories

* リポジトリ先を「~/.sbt/repositories」内に指定することにより、
 リポジトリ取得先を変更できる

https://www.scala-sbt.org/1.x/docs/Proxy-Repositories.html

例:~/.sbt/repositories

[repositories]
my-maven-proxy1: http://localhost:8081/repository/hello-world-repo/
my-maven-proxy2: http://localhost:8081/repository/maven-public/

2)resolvers

* build.sbt 内でリポジトリ先を追加できる

https://www.scala-sbt.org/1.x/docs/Resolvers.html

使用上の注意

* あくまで、「追加」。
 => なので、試した限りだと、
  リポジトリ先の優先度を上げたり、
  デフォルトを打ち消すのは無理そう

https://www.scala-sbt.org/1.x/docs/Resolvers.html

構文

// 単一リポジトリの追加
resolvers +="【Repository Name】" at "【Location】"

// 複数リポジトリの追加
resolvers ++= Seq(
    "【Repository Name1】" at "【Location1】",
    "【Repository Name2】" at "【Location2】"
)

例:build.sbt

resolvers +="my-maven-proxy" at "http://localhost:8081/repository/hello-world-repo/"

【2】Sonatype Nexus

* まず、使う前に、「Sonatype Nexus」について触れる

https://www.sonatype.com/products/sonatype-nexus-repository

Sonatype Nexus とは

* リポジトリマネージャ
 => 自前でMavenなどのリポジトリを立てることができる
 => 別製品だと、Archiva/Artifactory 等があるらしい(以下のサイト参照)

https://qiita.com/shrkw/items/fbd0aeb3bcaf4dd006ba

1)サポートリポジトリ

* 以下をみてもらうと多岐にわたるのが分かる

https://www.sonatype.com/products/language-and-package-support

主なサポートリポジトリ一覧

* Maven
* Gradle
* PyPI
* npm
* NuGet
* APT
* Yum
* docker
* Helm

etc...

【3】Sonatype Nexus を使った実験

0)前提条件

[1] docker compose が使えること

* 設定されていない場合は、以下の関連記事を参照のこと

https://dk521123.hatenablog.com/entry/2023/01/02/000000
[2] sbt が設定されていること

* 設定されていない場合は、以下の関連記事を参照のこと

https://dk521123.hatenablog.com/entry/2023/08/13/000000

1)Sonatype Nexus の構築

* Docker composeを使って Sonatype Nexus を立てる

[1] compose.yml を作成

version: '2'
services:
  nexus3:
    image: sonatype/nexus3
    volumes:
      - nexus-data:/nexus-data
    ports:
      - 8081:8081
volumes:
  nexus-data:

[2] compose.yml を実行

docker compose up -d

[3] デフォルトパスワードを調べる

# Docker container ID を調べる
docker ps

#  docker exec -it <ContainerID> bash
docker exec -it 0a49211595e2 bash

cd /nexus-data
cat admin.password
# デフォルトパスワードが分かる

exit

2)Sonatype Nexus の Web UI へアクセス

* ブラウザからリポジトリを独自のリポジトリを作成する

[1] Sonatype Nexus の Web UI へログインする

1) 以下のURLをブラウザでアクセス

http://localhost:8081/

2) 右上の「Sign in」アイコン押下し、以下でログインを試みる
 + User: admin
 + Password: 「 [3] デフォルトパスワードを調べる」で得た文字列

3) ログイン変更を求められるので対応する
 => 今回は、「admin123」とする

[2] リポジトリ一覧を表示する

1) 上部の「設定・ギアアイコン」を押下
2) [Repositories] を選択
 => リポジトリ一覧を表示される
 => その中で、例えば「maven-central」をクリックすると
  「URL: http://localhost:8081/repository/maven-central/」などの
  詳細情報が表示される

補足:独自のリポジトリも作成可能

* 以下のサイトを参考にリポジトリ「hello-world-repo」を作った

https://qiita.com/h-oikawa/items/791b6ee4e2f08645392c

3)sbt クライアント側の設定

[1] リポジトリ先を変更するために、~/.sbt/repositories 作成

[repositories]
my-maven-proxy1: http://localhost:8081/repository/hello-world-repo/
my-maven-proxy2: http://localhost:8081/repository/maven-public/

[2] リポジトリ先の認証情報を格納するために、~/.sbt/.credentials 作成

realm=Sonatype Nexus Repository Manager
host=localhost
user=admin
password=admin123

4)sbt 実行

[1] sbt 実験用の Hello world リポジトリ作成

* 以下の関連記事の「【3】Hello World」を参考に
 簡単なHello world リポジトリを作成する

https://dk521123.hatenablog.com/entry/2023/03/10/193805

# より抜粋

$ mkdir HelloWorld
$ cd HelloWorld
$ sbt new scala/hello-world.g8
[info] welcome to sbt 1.9.7 (Eclipse Adoptium Java 11.0.21)
...
A template to demonstrate a minimal Scala application

name [Hello World template]:hello << 任意の名前入力(今回は「hello」)

[2] sbt run を実行する

$ cd hello
$ ls -al
build.sbt << があることを確認
...

$ sbt run
[info] welcome to sbt 1.9.7 (Eclipse Adoptium Java 11.0.21)
[info] loading project definition from /home/user/nexus/HelloWorld/hello/project
[info] loading settings for project hello from build.sbt ...
[info] set current project to hello-world (in build file:/home/user/nexus/HelloWorld/hello/)
[info] Fetching artifacts of
http://localhost:8081/repository/maven-public/org/scala-lang/scala-libra …| => hello / scalaCompilerBridgeBinaryJar 0s
    0.0% [          ] 0B (0B / s)
http://localhost:8081/repository/maven-public/org/scala-lang/scala-refle http://localhost:8081/repository/maven-public/org/scala-lang/scala-libra …  0.0% [          ] 0B (0B / s)
    0.0% [          ] 0B (0B / s)

# ↑で、「localhost:8081/repository/...」から取りに行っていることが分かる
# (実験成功!)

実験2:~/.sbt/.credentialsがなかった場合

# 疑似的に「~/.sbt/.credentials」を削除
$ mv ~/.sbt/.credentials ~/.sbt/.credentials_bk

# キャッシュされているファイルなどを削除
$ rm -rf target
$ rm -rf project

# 実行
$ sbt run
[info] [launcher] getting org.scala-sbt sbt 1.9.8  (this may take some time)...

# しっかりエラー「Connection refused」が出る
[error] [launcher] xsbt.boot.internal.shaded.coursier.error.ResolutionError$CantDownloadModule: Error downloading org.scala-sbt:sbt:1.9.8
  download error: Caught java.net.ConnectException (Connection refused (Connection refused)) while downloading http://localhost:8081/repository/hello-world-repo/org/scala-sbt/sbt/1.9.8/sbt-1.9.8.pom
  download error: Caught java.net.ConnectException (Connection refused (Connection refused)) while downloading http://localhost:8081/repository/maven-public/org/scala-sbt/sbt/1.9.8/sbt-1.9.8.pom


[error] [launcher] could not retrieve sbt 1.9.8

参考文献

https://qiita.com/h-oikawa/items/791b6ee4e2f08645392c

関連記事

SBT ~ 環境構築編 ~
https://dk521123.hatenablog.com/entry/2024/01/13/002637
SBT ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2023/03/22/000000
SBT ~ 基本編 / build.sbt ~
https://dk521123.hatenablog.com/entry/2023/01/27/000000
SBT ~ 基本編 / sbtコマンド ~
https://dk521123.hatenablog.com/entry/2023/01/26/000000
SBT ~ JAR作成/実行 ~
https://dk521123.hatenablog.com/entry/2023/10/12/200450
SBT ~ Proxy環境下でSBTを使用する ~
https://dk521123.hatenablog.com/entry/2023/11/23/000000
Docker compose ~ Version 2 ~
https://dk521123.hatenablog.com/entry/2023/01/02/000000
SDKMAN ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2023/08/13/000000
Scala ~ 環境構築編 ~
https://dk521123.hatenablog.com/entry/2023/03/10/193805
AWS CodeArtifact ~ 基礎知識編 ~
https://dk521123.hatenablog.com/entry/2023/12/26/012343
AWS CodeArtifact ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2024/01/11/233802
AWS CodeArtifact ~ SBTでCodeArtifactを使う ~
https://dk521123.hatenablog.com/entry/2024/01/20/000329