■ はじめに
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をブラウザでアクセス
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