scala - 如何在 sonatype 和 maven 中发布 scala 模块?

标签 scala maven module sbt sonatype

我一直在尝试将模块发布到 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$1(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$1(PgpSettings.scala:111)
[error]     at scala.Function1.$anonfun$compose$1(Function1.scala:44)
[error]     at sbt.internal.util.$tilde$greater.$anonfun$$u2219$1(TypeFunctions.scala:40)
[error]     at sbt.std.Transform$$anon$4.work(System.scala:67)
[error]     at sbt.Execute.$anonfun$submit$2(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$1(Execute.scala:269)
[error]     at sbt.ConcurrentRestrictions$$anon$4.$anonfun$submitValid$1(ConcurrentRestrictions.scala:178)
[error]     at sbt.CompletionService$$anon$2.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

我尝试了很多方法和插件设置说明,但没有异常(exception)。

最佳答案

你可以这样做:

  1. 检查$ gpg --version

如果没有,安装gnupg

  1. 然后运行 ​​$ gpg --gen-key 生成 key 。 设置 realm ,设置 邮件地址,设置 passphrase

key 生成完成

  1. 检查 $ gpg --list-keys

你会得到这种类型的结果-

pub   rsa4096 2018-08-22 [SC]
      1234517530FB96F147C6A146A326F592D39AAAAA
uid           [ultimate] your name <you@example.com>
sub   rsa4096 2018-08-22 [E]
  1. 现在使用此命令获取公钥 block

    $ gpg -a --export 1234517530FB96F147C6A146A326F592D39AAAAA

复制全文-

-----开始 PGP 公钥 block --

-----结束 PGP 公钥 block -----

提交 pgp key 服务器,等待几个小时。

4.1 将 secring.asc 文件导出到计算机的任何位置。 写这个命令

$ gpg -a --export-secret-keys > /home/johnny/secring.asc

4.2 复制这个文件并放到这个位置

~/.sbt/gpg/secring.asc

  1. 现在您必须设置 sbt-pgp 插件

在这个 ~/.sbt/1.0/plugins/gpg.sbt 文件中为 SBT 项目全局启用它,添加这一行 - (如果 gpg.sbt 文件不存在,则在此处创建)

addSbtPlugin("com.jsuereth" % "sbt-pgp" % "1.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

  1. 现在创建这个文件~/.sbt/1.0/sonatype.sbt 只需将此行添加到文件中

    credentials += Credentials(Path.userHome/".sbt"/"sonatype_credential")

7.1 通过 link 创建 JIRA 帐户

7.2 通过 create 按钮创建一个问题以在 sonatype 中打开您的存储库 enter image description here

7.3 创建 github 存储库或在问题创建表单中使用您的模块相关存储库。

您将从这张图片中了解您的表单 enter image description here

7.4 使用您的问题的 OSSRH-XXXXX 字符串创建另一个存储库,如下所示 - github用户名/OSSRH-xxxx。验证您的存储库

您将需要等待几分钟才能获得批准。如果您的 repo 获得批准,您将收到一封邮件。

  1. 现在创建这个文件~/.sbt/sonatype_credential,只需添加这一行并输入密码和用户名 - 分别设置您的 JIRA 密码和用户名。

     realm=Sonatype Nexus Repository Manager
     host=oss.sonatype.org
     user=username
     password=password
    
  2. 在你模块的 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 项目上。

现在您可以通过此链接检查您上传的内容

https://oss.sonatype.org/content/repositories/snapshots/com/github/$yourgitUserName/$repoName

或登录https://oss.sonatype.org/并按您的模块名称搜索

enter image description here

关于scala - 如何在 sonatype 和 maven 中发布 scala 模块?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57072002/

相关文章:

scala - 如何避免 Slick 的模型声明冗长和重复

xml - 如何使用外部 jar 和 Maven 编译/打包 Spark 2.0 项目

json - 使用 Play! 将两个 json 对象渲染到 View 中斯卡拉2.3

module - ES6 导出对象的所有值

interface - OCaml 接口(interface)与签名?

scala - 如何使用 Akka Streams 在分隔符上拆分入站流

maven - 社区版中是否提供 IntelliJ 的 Maven 依赖关系图功能?

java - Selenium - Maven/TestNG : How to add "testng.xml" and log4j2. pom.xml 中的 xml 路径,因此可执行的 .jar 文件也可以在其他计算机上执行?

java - 如何取消引用使用 intelliJ-IDE 构建的 Spring MVC 应用程序的旧 Wildfly 9.0.1 部署 Artifact ?

javascript - 从 require() 获取类实例