ScalaのライブラリをMavenリポジトリで公開する

## Scalaのライブラリを公開する

開発が止まったライブラリ（プラグイン）をforkして、新しいバージョンでも利用できるようにしてから
Mavenリポジトリに公開するまでやってみた。


## 環境
Windows10
Gpg4win 4.0.0

## 手順

### 公開プロジェクトの作成

まずは公開するプロジェクトをオープンなリポジトリで公開しておく。

Githubで公開したこの[プロジェクト](https://github.com/tino1231/play2-i18n-hocon)。


### JIRAアカウントの作成

https://issues.sonatype.org/secure/Signup!default.jspa

ここから名前とメールアドレスを登録しアカウントを作成する。

### チケットを登録する

https://issues.sonatype.org/secure/CreateIssue.jspa?issuetype=21&pid=10134

Githubで公開している場合以下のイメージで入力する。

|項目 | 入力例 | 
|:-----------|:-----------|
| Group Id| io.github.【Githubアカウント】|
| Project URL| https://github.com/【Githubアカウント】/【公開プロジェクト】| 
| SCM url必須| https://github.com/【Githubアカウント】/【公開プロジェクト】.git| 

自動で対応してくれており、問題なければすぐに準備してもらえる。

### 鍵の登録

```
gpg --gen-key
gpg --list-keys
gpg --keyserver keyserver.ubuntu.com --send-keys <list keys で表示された公開鍵>
```
:::note warn
組織内のネットワークだとPortが絞られていて送信できない場合がある。
keyserver.ubuntu.com:80で送ると送信できた。
:::

### プロジェクトにsbt-pgpを追加する

```sbt:plugin.sbt
addSbtPlugin("com.github.sbt" % "sbt-pgp" % "2.1.2")
```

### sonatypeの資格情報を作成する
まずは、ファイルを作成する
```
$HOME/.sbt/1.0/sonatype.sbt
```
以下を書き込む
```scala:sonatype.sbt
credentials += Credentials($HOME / ".sbt" / "sonatype_credentials")
```
資格情報のファイルを作成する
```
~/.sbt/sonatype_credentials
```
以下を書き込む
``` :sonatype_credentials
realm=Sonatype Nexus Repository Manager
host=s01.oss.sonatype.org
user=【JIRAのアカウント】
password=【JIRAのパスワード】
```

### プロジェクトのbuild.sbtに追加する
```scala:build.sbt
version := "0.0.1-snapshot"

ThisBuild / organization := "io.github.【Githubアカウント】"
ThisBuild / organizationName := "【Githubアカウント】"
ThisBuild / organizationHomepage := Some(url("【ホームページのURL】"))

ThisBuild / scmInfo := Some(
  ScmInfo(
    url("https://github.com/【Githubアカウント】/【公開プロジェクト】"),
    "scm:git@github.【Githubアカウント】/【公開プロジェクト】.git"
  )
)

ThisBuild / developers := List(
  Developer(
    id    = "【Githubアカウント】",
    name  = "【名前】",
    email = "【メールアドレス】",
    url   = url("【ホームページのURL】")
  )
)

ThisBuild / description := "プロジェクトの説明"
ThisBuild / licenses := List("Apache 2" -> new URL("http://www.apache.org/licenses/LICENSE-2.0.txt"))
ThisBuild / homepage := Some(url("https://github.com/【Githubアカウント】/【公開プロジェクト】"))

// Remove all additional repository other than Maven Central from POM
ThisBuild / pomIncludeRepository := { _ => false }

ThisBuild / publishTo := {
  val nexus = "https://s01.oss.sonatype.org/"
  if (isSnapshot.value) Some("snapshots" at nexus + "content/repositories/snapshots")
  else Some("releases" at nexus + "service/local/staging/deploy/maven2")
}

ThisBuild / publishMavenStyle := true
```

### コマンド実行

```scala
sbt publishSigned
```
途中でPINの入力を求められるので、入力する。


JIRAアカウントを使って以下からログイン
https://s01.oss.sonatype.org/

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75217/b9b607e2-92d4-41f3-2a4b-3e836a07d03c.png)

snapshotsのリポジトリ内にアップロードされていることを確認する。

### リリースする
```scala:build.sbt
version := "0.0.1"
```
snapshotを外して再度コマンドを実行する。

Stagingのリポジトリにアップロードされるので、Closeボタンを押してリポジトリを閉じた後に

Releaseボタンを押して公開する。


### 公開された
https://mvnrepository.com/artifact/io.github.tino1231



## 参考

https://central.sonatype.org/publish/publish-guide/

https://github.com/sbt/sbt-pgp

https://dev.to/awwsmm/publish-your-scala-project-to-maven-in-5-minutes-with-sonatype-326l