Nexusで自前のMavenリポジトリを建ててsbtから使用する

Scala現場でプロジェクトの依存関係をクローズドなMavenリポジトリで管理できないかという話が上がったので、ひとまずローカル上で簡易に検証した内容を備忘として残します。

---

# ローカルにリポジトリサーバを建てる
本番用のリポジトリサーバは別途現場で用意される。
ローカルでの検証は手軽にNexus公式のDockerイメージを使用。

## Nexusサーバ作成～ログイン
適当に作業フォルダを掘って`docker-compose.yml`を下記の通り作成。

```bash
$ mkdir nexus && cd nexus
$ vim docker-compose.yml
```

```yaml:docker-compose.yml
version: '2'
services:
  nexus3:
    image: sonatype/nexus3
    volumes:
      - nexus-data:/nexus-data
    ports:
      - 8081:8081
volumes:
  nexus-data:
```

作成したらDockerコンテナを起動、しばし待機。

```bash
$ docker-compose up -d
Creating network "nexus_default" with the default driver
Creating nexus_nexus3_1 ...
Creating nexus_nexus3_1 ... done
```

コンテナのログに下記のように表示されたら起動完了。

```bash
$ docker-compose logs
...
nexus3_1  | -------------------------------------------------
nexus3_1  |
nexus3_1  | Started Sonatype Nexus OSS 3.6.2-01
nexus3_1  |
nexus3_1  | -------------------------------------------------
```

`http://localhost:8081/`にアクセスするとNexusの管理コンソールが表示される。

右上のリンクから「Sign In」
※デフォルトで次の管理ユーザ／パスワードが用意されている：[admin/admin123]

![2017-12-16_21h57_09.png](https://qiita-image-store.s3.amazonaws.com/0/104276/2c7762bb-559b-fcd6-49fd-7f8392dc25b5.png)

⇒ログイン後、必要に応じて「設定」＞「Users」からユーザを作成。(今回は検証用なので省略)

![2017-12-16_22h03_35.png](https://qiita-image-store.s3.amazonaws.com/0/104276/c72d4963-0dfa-e457-c133-e4a276f76cdf.png)

## Mavenリポジトリ作成
自前のライブラリを登録するMavenリポジトリを作成する。

「repositories」＞「Create repository」＞「maven2 (hosted)」

![2017-12-16_22h26_00.png](https://qiita-image-store.s3.amazonaws.com/0/104276/f358a1c4-b089-7c74-ed6e-30ade8d4b389.png)

![2017-12-16_22h26_12.png](https://qiita-image-store.s3.amazonaws.com/0/104276/2088abdf-c61e-623a-3aa6-cff496582cf1.png)

Snapshot用とRelease用をそれぞれ作成。

![2017-12-16_22h27_23.png](https://qiita-image-store.s3.amazonaws.com/0/104276/bc0dc7d8-fd96-d482-1d58-37d31d39a641.png)

![2017-12-16_22h28_06.png](https://qiita-image-store.s3.amazonaws.com/0/104276/4de2fc4f-a184-9fa4-a1f0-658707507d3f.png)


参照用に上記リポジトリをまとめたグループを作成。
「repositories」＞「Create repository」＞「maven2 (group)」

![2017-12-16_22h41_49.png](https://qiita-image-store.s3.amazonaws.com/0/104276/ce9aada8-2ba6-bc6b-6287-e432ad73f1e8.png)

![2017-12-16_22h40_29.png](https://qiita-image-store.s3.amazonaws.com/0/104276/d235fe95-5174-4821-cc2d-73fac53b0651.png)
※`maven-central`等の追加はお好みで。

---

## sbtからリポジトリを使用する
自作したリポジトリをScalaプロジェクトで利用するには`build.sbt`に下記のように設定する。

```scala:build.sbt
organization := "com.example"

name := "scala-libs-sample"

version := "0.0.1-SNAPSHOT"

////////////////////////////////////////////////////////////////////////////////////
// My Hosted Repository
val myrepos = "http://localhost:8081/"
// リポジトリ認証情報 => 後述の[~/.sbt/.credentials]の内容を読み込む
credentials += Credentials(Path.userHome / ".sbt" / ".credentials")

// リポジトリへデプロイする側の設定
publishMavenStyle := true
publishArtifact in Test := false
pomIncludeRepository := { _ => false }
publishTo := {
  if (isSnapshot.value)
    Some("snapshots" at myrepos + "repository/my-snapshots")
  else
    Some("releases"  at myrepos + "repository/my-releases")
}

// モジュールを利用する側の設定
resolvers += "Nexus" at myrepos + "repository/my-repo-group/"
libraryDependencies += "com.example" % "scala-libs-sample" % "0.0.1-SNAPSHOT"
```

リポジトリサーバの認証情報は、ホームディレクトリに`.sbt/.credentials`ファイルを作成し下記のように記載する。（※ユーザ名などは適宜変更）

```properties:~/.sbt/.credentials
realm=Sonatype Nexus Repository Manager
host=localhost
user=admin
password=admin123
```

設定に問題が無ければ`publish`コマンドでサーバにモジュールがデプロイされるはず＞

```bash
$ sbt publish
...
[info]  published scala-libs-sample_2.10 to http://localhost:8081/repository/my-snapshots/com/example/scala-libs-sample_2.10/0.0.1-SNAPSHOT/scala-libs-sample_2.10-0.0.1-SNAPSHOT.pom
[info]  published scala-libs-sample_2.10 to http://localhost:8081/repository/my-snapshots/com/example/scala-libs-sample_2.10/0.0.1-SNAPSHOT/scala-libs-sample_2.10-0.0.1-SNAPSHOT.jar
[info]  published scala-libs-sample_2.10 to http://localhost:8081/repository/my-snapshots/com/example/scala-libs-sample_2.10/0.0.1-SNAPSHOT/scala-libs-sample_2.10-0.0.1-SNAPSHOT-sources.jar
[info]  published scala-libs-sample_2.10 to http://localhost:8081/repository/my-snapshots/com/example/scala-libs-sample_2.10/0.0.1-SNAPSHOT/scala-libs-sample_2.10-0.0.1-SNAPSHOT-javadoc.jar
[success] Total time: 2 s, completed 2017/12/16 23:14:43
```