如何在sonatype和maven中发布scala模块?
How to publish scala module in sonatype and maven?
我一直在尝试将模块发布到 sonatype,但我遇到了这个异常--
[error] java.io.FileNotFoundException: /home/johnny/.sbt/gpg/secring.asc (No such file or directory)
[error] at java.io.FileInputStream.open0(Native Method)
[error] at java.io.FileInputStream.open(FileInputStream.java:195)
[error] at java.io.FileInputStream.<init>(FileInputStream.java:138)
[error] at com.jsuereth.pgp.StreamingLoadable.loadFromFile(StreamingLoadable.scala:11)
[error] at com.jsuereth.pgp.StreamingLoadable.loadFromFile$(StreamingLoadable.scala:11)
[error] at com.jsuereth.pgp.SecretKeyRing$.loadFromFile(SecretKeyRing.scala:45)
[error] at com.jsuereth.pgp.PGP$.loadSecretKeyRing(package.scala:31)
[error] at com.jsuereth.pgp.cli.PgpStaticContext.secretKeyRing(context.scala:27)
[error] at com.jsuereth.pgp.cli.PgpStaticContext.secretKeyRing$(context.scala:27)
[error] at com.typesafe.sbt.pgp.SbtPgpStaticContext.secretKeyRing(SbtPgpCommandContext.scala:9)
[error] at com.jsuereth.pgp.cli.DelegatingPgpStaticContext.secretKeyRing(context.scala:34)
[error] at com.jsuereth.pgp.cli.DelegatingPgpStaticContext.secretKeyRing$(context.scala:34)
[error] at com.typesafe.sbt.pgp.SbtPgpCommandContext.secretKeyRing(SbtPgpCommandContext.scala:14)
[error] at com.typesafe.sbt.pgp.BouncyCastlePgpSigner.$anonfun$keyId(PgpSigner.scala:37)
[error] at scala.runtime.java8.JFunction0$mcJ$sp.apply(JFunction0$mcJ$sp.java:12)
[error] at scala.Option.getOrElse(Option.scala:121)
[error] at com.typesafe.sbt.pgp.BouncyCastlePgpSigner.<init>(PgpSigner.scala:37)
[error] at com.typesafe.sbt.pgp.PgpSettings$.$anonfun$bcPgpSigner(PgpSettings.scala:111)
[error] at scala.Function1.$anonfun$compose(Function1.scala:44)
[error] at sbt.internal.util.$tilde$greater.$anonfun$$u2219(TypeFunctions.scala:40)
[error] at sbt.std.Transform$$anon.work(System.scala:67)
[error] at sbt.Execute.$anonfun$submit(Execute.scala:269)
[error] at sbt.internal.util.ErrorHandling$.wideConvert(ErrorHandling.scala:16)
[error] at sbt.Execute.work(Execute.scala:278)
[error] at sbt.Execute.$anonfun$submit(Execute.scala:269)
[error] at sbt.ConcurrentRestrictions$$anon.$anonfun$submitValid(ConcurrentRestrictions.scala:178)
[error] at sbt.CompletionService$$anon.call(CompletionService.scala:37)
[error] at java.util.concurrent.FutureTask.run(FutureTask.java:266)
[error] at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
[error] at java.util.concurrent.FutureTask.run(FutureTask.java:266)
[error] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
[error] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
[error] at java.lang.Thread.run(Thread.java:748)
[error] (Global / pgpSigner) java.io.FileNotFoundException: /home/johnny/.sbt/gpg/secring.asc (No such file or directory)
[error] Total time: 1 s, completed Jul 17, 2019 2:46:54 PM
我已经尝试了很多方法和插件设置说明,但除了例外情况外,情况有所不同。
你可以这样操作:
- 检查
$ gpg --version
如果没有,安装gnupg
。
- 然后运行
$ gpg --gen-key
生成密钥。
设置realm
,设置mail address
,设置passphrase
密钥生成完成
- 通过
$ gpg --list-keys
检查
你会得到这样的结果-
pub rsa4096 2018-08-22 [SC]
1234517530FB96F147C6A146A326F592D39AAAAA
uid [ultimate] your name <you@example.com>
sub rsa4096 2018-08-22 [E]
现在使用此命令获取public密钥块
$ gpg -a --export 1234517530FB96F147C6A146A326F592D39AAAAA
复制全文-
-----开始 PGP PUBLIC 密钥块-----
到
-----结束 PGP PUBLIC 密钥块-----
提交 pgp 密钥服务器,等待几个小时。
4.1 将 secring.asc 文件导出到计算机的任何位置。
写这个命令
$ gpg -a --export-secret-keys > /home/johnny/secring.asc
4.2 复制此文件并将其放置到此位置
~/.sbt/gpg/secring.asc
- 现在您必须设置 sbt-pgp 插件
在这个 ~/.sbt/1.0/plugins/gpg.sbt 文件中为 SBT 项目全局启用它添加这一行-(如果gpg.sbt 文件不存在在那里创建)
addSbtPlugin("com.jsuereth" % "sbt-pgp" % "1.1.1")
- 转到/home/$username/.gnugp文件夹,如果你看到pubring.kpx文件但没有secring.gpg 文件,您不需要在模块的 build.sbt 文件中添加
useGpg := true
行。如果 secring.gpg 文件存在,请在模块的 build.sbt 文件中添加 useGpg := true
。
6.1 运行 在您的终端上执行此命令以查找您机器中的 gpg 可执行文件
$ dpkg --listfiles gpg
/.
/usr
/usr/bin
/usr/bin/gpg
/usr/share
/usr/share/doc
/usr/share/doc/gpg
/usr/share/doc/gpg/copyright
/usr/share/man
/usr/share/man/man1
/usr/share/man/man1/gpg.1.gz
/usr/share/doc/gpg/NEWS.Debian.gz
/usr/share/doc/gpg/changelog.Debian.gz
6.2 将此添加到 ~/.sbt/gpg.sbt 文件
gpgCommand := "/user/bin/gpg"
6.3 如果在你的 /home/$username/.gnugp 文件夹中你有 secring.gpg 文件你将不得不通过
将此添加到~/.sbt/gpg.sbt文件
pgpSecretRing := file("/path/to/my/secring.gpg")
有关详细信息,请访问此 link
现在创建这个文件~/.sbt/1.0/sonatype.sbt
只需将此行添加到文件
credentials += Credentials(Path.userHome / ".sbt" / "sonatype_credential")
7.1 通过这个link
创建JIRA账户
7.2 通过 create 按钮创建一个用于在 sonatype 中打开存储库的问题
7.3 创建 github 存储库或在问题创建表单中使用与模块相关的存储库。
你会从这张照片中了解你的表格
7.4 使用问题的 OSSRH-XXXXX 字符串创建另一个存储库,如下所示-
githubusername/OSSRH-xxxx。验证您的存储库
您需要等待几分钟才能获得批准。如果您的回购协议获得批准,您将收到一封邮件。
现在创建这个文件~/.sbt/sonatype_credential,只需添加这一行并在密码和用户名中——分别设置你的JIRA密码和用户名.
realm=Sonatype Nexus Repository Manager
host=oss.sonatype.org
user=username
password=password
在模块的 build.sbt 文件中设置此配置---
ThisBuild / organization := "com.example.project2"
ThisBuild / organizationName := "example"
ThisBuild / organizationHomepage := Some(url("http://example.com/"))
ThisBuild / scmInfo := Some(
ScmInfo(
url("https://github.com/your-account/your-project"),
"scm:git@github.com:your-account/your-project.git"
)
)
ThisBuild / developers := List(
Developer(
id = "Your identifier",
name = "Your Name",
email = "your@email",
url = url("http://your.url")
)
)
ThisBuild / description := "Some descripiton about your project."
ThisBuild / licenses := List("Apache 2" -> new URL("http://www.apache.org /licenses/LICENSE-2.0.txt"))
ThisBuild / homepage := Some(url("https://github.com/example/project"))
// Remove all additional repository other than Maven Central from POM
ThisBuild / pomIncludeRepository := { _ => false }
ThisBuild / publishTo := {
val nexus = "https://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
现在 运行 publishSigned
在你的 sbt 项目上。
现在您可以通过此link
检查您的上传
https://oss.sonatype.org/content/repositories/snapshots/com/github/$yourgitUserName/$repoName
或登录 https://oss.sonatype.org/ 并按您的模块名称搜索
我一直在尝试将模块发布到 sonatype,但我遇到了这个异常--
[error] java.io.FileNotFoundException: /home/johnny/.sbt/gpg/secring.asc (No such file or directory)
[error] at java.io.FileInputStream.open0(Native Method)
[error] at java.io.FileInputStream.open(FileInputStream.java:195)
[error] at java.io.FileInputStream.<init>(FileInputStream.java:138)
[error] at com.jsuereth.pgp.StreamingLoadable.loadFromFile(StreamingLoadable.scala:11)
[error] at com.jsuereth.pgp.StreamingLoadable.loadFromFile$(StreamingLoadable.scala:11)
[error] at com.jsuereth.pgp.SecretKeyRing$.loadFromFile(SecretKeyRing.scala:45)
[error] at com.jsuereth.pgp.PGP$.loadSecretKeyRing(package.scala:31)
[error] at com.jsuereth.pgp.cli.PgpStaticContext.secretKeyRing(context.scala:27)
[error] at com.jsuereth.pgp.cli.PgpStaticContext.secretKeyRing$(context.scala:27)
[error] at com.typesafe.sbt.pgp.SbtPgpStaticContext.secretKeyRing(SbtPgpCommandContext.scala:9)
[error] at com.jsuereth.pgp.cli.DelegatingPgpStaticContext.secretKeyRing(context.scala:34)
[error] at com.jsuereth.pgp.cli.DelegatingPgpStaticContext.secretKeyRing$(context.scala:34)
[error] at com.typesafe.sbt.pgp.SbtPgpCommandContext.secretKeyRing(SbtPgpCommandContext.scala:14)
[error] at com.typesafe.sbt.pgp.BouncyCastlePgpSigner.$anonfun$keyId(PgpSigner.scala:37)
[error] at scala.runtime.java8.JFunction0$mcJ$sp.apply(JFunction0$mcJ$sp.java:12)
[error] at scala.Option.getOrElse(Option.scala:121)
[error] at com.typesafe.sbt.pgp.BouncyCastlePgpSigner.<init>(PgpSigner.scala:37)
[error] at com.typesafe.sbt.pgp.PgpSettings$.$anonfun$bcPgpSigner(PgpSettings.scala:111)
[error] at scala.Function1.$anonfun$compose(Function1.scala:44)
[error] at sbt.internal.util.$tilde$greater.$anonfun$$u2219(TypeFunctions.scala:40)
[error] at sbt.std.Transform$$anon.work(System.scala:67)
[error] at sbt.Execute.$anonfun$submit(Execute.scala:269)
[error] at sbt.internal.util.ErrorHandling$.wideConvert(ErrorHandling.scala:16)
[error] at sbt.Execute.work(Execute.scala:278)
[error] at sbt.Execute.$anonfun$submit(Execute.scala:269)
[error] at sbt.ConcurrentRestrictions$$anon.$anonfun$submitValid(ConcurrentRestrictions.scala:178)
[error] at sbt.CompletionService$$anon.call(CompletionService.scala:37)
[error] at java.util.concurrent.FutureTask.run(FutureTask.java:266)
[error] at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
[error] at java.util.concurrent.FutureTask.run(FutureTask.java:266)
[error] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
[error] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
[error] at java.lang.Thread.run(Thread.java:748)
[error] (Global / pgpSigner) java.io.FileNotFoundException: /home/johnny/.sbt/gpg/secring.asc (No such file or directory)
[error] Total time: 1 s, completed Jul 17, 2019 2:46:54 PM
我已经尝试了很多方法和插件设置说明,但除了例外情况外,情况有所不同。
你可以这样操作:
- 检查
$ gpg --version
如果没有,安装gnupg
。
- 然后运行
$ gpg --gen-key
生成密钥。 设置realm
,设置mail address
,设置passphrase
密钥生成完成
- 通过
$ gpg --list-keys
检查
你会得到这样的结果-
pub rsa4096 2018-08-22 [SC]
1234517530FB96F147C6A146A326F592D39AAAAA
uid [ultimate] your name <you@example.com>
sub rsa4096 2018-08-22 [E]
现在使用此命令获取public密钥块
$ gpg -a --export 1234517530FB96F147C6A146A326F592D39AAAAA
复制全文-
-----开始 PGP PUBLIC 密钥块-----
到
-----结束 PGP PUBLIC 密钥块-----
提交 pgp 密钥服务器,等待几个小时。
4.1 将 secring.asc 文件导出到计算机的任何位置。 写这个命令
$ gpg -a --export-secret-keys > /home/johnny/secring.asc
4.2 复制此文件并将其放置到此位置
~/.sbt/gpg/secring.asc
- 现在您必须设置 sbt-pgp 插件
在这个 ~/.sbt/1.0/plugins/gpg.sbt 文件中为 SBT 项目全局启用它添加这一行-(如果gpg.sbt 文件不存在在那里创建)
addSbtPlugin("com.jsuereth" % "sbt-pgp" % "1.1.1")
- 转到/home/$username/.gnugp文件夹,如果你看到pubring.kpx文件但没有secring.gpg 文件,您不需要在模块的 build.sbt 文件中添加
useGpg := true
行。如果 secring.gpg 文件存在,请在模块的 build.sbt 文件中添加useGpg := true
。
6.1 运行 在您的终端上执行此命令以查找您机器中的 gpg 可执行文件
$ dpkg --listfiles gpg
/.
/usr
/usr/bin
/usr/bin/gpg
/usr/share
/usr/share/doc
/usr/share/doc/gpg
/usr/share/doc/gpg/copyright
/usr/share/man
/usr/share/man/man1
/usr/share/man/man1/gpg.1.gz
/usr/share/doc/gpg/NEWS.Debian.gz
/usr/share/doc/gpg/changelog.Debian.gz
6.2 将此添加到 ~/.sbt/gpg.sbt 文件
gpgCommand := "/user/bin/gpg"
6.3 如果在你的 /home/$username/.gnugp 文件夹中你有 secring.gpg 文件你将不得不通过
将此添加到~/.sbt/gpg.sbt文件pgpSecretRing := file("/path/to/my/secring.gpg")
有关详细信息,请访问此 link
现在创建这个文件~/.sbt/1.0/sonatype.sbt 只需将此行添加到文件
credentials += Credentials(Path.userHome / ".sbt" / "sonatype_credential")
7.1 通过这个link
创建JIRA账户7.2 通过 create 按钮创建一个用于在 sonatype 中打开存储库的问题
7.3 创建 github 存储库或在问题创建表单中使用与模块相关的存储库。
你会从这张照片中了解你的表格
7.4 使用问题的 OSSRH-XXXXX 字符串创建另一个存储库,如下所示- githubusername/OSSRH-xxxx。验证您的存储库
您需要等待几分钟才能获得批准。如果您的回购协议获得批准,您将收到一封邮件。
现在创建这个文件~/.sbt/sonatype_credential,只需添加这一行并在密码和用户名中——分别设置你的JIRA密码和用户名.
realm=Sonatype Nexus Repository Manager host=oss.sonatype.org user=username password=password
在模块的 build.sbt 文件中设置此配置---
ThisBuild / organization := "com.example.project2" ThisBuild / organizationName := "example" ThisBuild / organizationHomepage := Some(url("http://example.com/")) ThisBuild / scmInfo := Some( ScmInfo( url("https://github.com/your-account/your-project"), "scm:git@github.com:your-account/your-project.git" ) ) ThisBuild / developers := List( Developer( id = "Your identifier", name = "Your Name", email = "your@email", url = url("http://your.url") ) ) ThisBuild / description := "Some descripiton about your project." ThisBuild / licenses := List("Apache 2" -> new URL("http://www.apache.org /licenses/LICENSE-2.0.txt")) ThisBuild / homepage := Some(url("https://github.com/example/project")) // Remove all additional repository other than Maven Central from POM ThisBuild / pomIncludeRepository := { _ => false } ThisBuild / publishTo := { val nexus = "https://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
现在 运行 publishSigned 在你的 sbt 项目上。
现在您可以通过此link
检查您的上传https://oss.sonatype.org/content/repositories/snapshots/com/github/$yourgitUserName/$repoName
或登录 https://oss.sonatype.org/ 并按您的模块名称搜索