【问题标题】:SBT publishing via SSH key auth not working通过 SSH 密钥身份验证的 SBT 发布不起作用
【发布时间】:2023-03-13 14:15:02
【问题描述】:

我的问题是:为什么我不能通过 SSH 从 SBT 发布到我的服务器?

上下文:

我正在开发一个 scala 库,我想通过 SSH(使用 SFTP 解析器)将它发布到带有 SBT v0.12.3 的远程存储库。我的项目/Build.scala SBT 设置文件的相关部分按照https://github.com/harrah/xsbt/wiki/Resolvers 的规定进行配置:

publishTo <<= version { v =>
    Some(Resolver.sftp(
        "My Repository",
        "example.com",
        "/var/www/public_html/repositories/" + (
            if (v.trim.endsWith("SNAPSHOT")) { "snapshots" } else { "releases" }
        )
    ))
},
resolvers ++= Seq(
    {
        import java.io.File
        val privateKeyFile: File = new File(sys.env("HOME") + "/.ssh/id_rsa")
        Resolver.ssh("scala-sh", "example.com") as("my-username", privateKeyFile) withPermissions("0644")
    },
    ...
),

当我运行sbt publish 时,一切正常,直到获得授权,它仍然会尝试提示我输入登录名/密码。当我在本地运行它时,它会显示用户名/密码提示,当我尝试在 SSH 连接到机器时远程发布时,它会失败并显示 java.awt.HeadlessException。结果似乎是未尝试所需的私钥类型的身份验证。

这是远程会话发布尝试的日志:

> sbt-version
[info] 0.12.3

> publish
[info] Packaging /home/me/my-lib/target/scala-2.10.1/my-lib_2.10.1-SNAPSHOT-sources.jar ...
[info] Done packaging.
[info] Wrote /home/me/my-lib/target/scala-2.10.1/my-lib_2.10.1-SNAPSHOT.pom
[info] :: delivering :: org.example#my-lib_2.10.1;SNAPSHOT :: SNAPSHOT :: release :: Sun Apr 21 12:48:59 PDT 2013
[info]  delivering ivy file to /home/me/my-lib/target/scala-2.10.1/ivy-SNAPSHOT.xml
[info] Generating API documentation for main sources...
model contains 75 documentable templates
[info] API documentation generation successful.
[info] Packaging /home/me/my-lib/target/scala-2.10.1/my-lib_2.10.1-SNAPSHOT-javadoc.jar ...
[info] Done packaging.
[info] Packaging my-lib-SNAPSHOT.jar ...
[info] Done packaging.
[trace] Stack trace suppressed: run last *:publish for the full output.
[error] (*:publish) java.awt.HeadlessException:
[error] No X11 DISPLAY variable was set, but this program performed an operation which requires it.
[error] Total time: 35 s, completed Apr 21, 2013 12:49:33 PM

失败是因为没有 X11 显示器。这是意外行为,因为 SBT 项目配置设置为使用私钥身份验证(请参阅上面的 resolvers)。

到目前为止,我可以想到 2 个可能的问题原因,详情如下。

可能的原因 #1:SBT 配置错误

我上面的配置有问题吗?

可能的原因 #2:从旧版本中遇到 Ivy 错误

在撰写本文时,我使用的是最新的 SBT,0.12.3。也许 SBT 使用的 Ivy 版本太旧了。越想越觉得不太可能,但我还不能排除。

我怎样才能知道 Ivy SBT 使用的是哪个版本?

然后..

如果它是旧的,有没有办法让 SBT 使用更新版本的 ivy?

还有另一个相关问题,请参阅ivy ssh publisher,它引用[0] 一个Old Ivy bug 导致java.awt.HeadlessExceptions

[0]ivy ssh publisher

  • “您使用的是哪个版本的 Ivy?2.0 版有一个 Jira 错误:issues.apache.org/jira/browse/IVY-783,现在应该修复。”

  • “好像我升级到 ivy 2.3 rc-2。SSH 发布工作。”

【问题讨论】:

  • 完整的堆栈跟踪可能有助于诊断这一点。你能抓住它Stack trace suppressed: run last *:publish for the full output 给你足够的信息来恢复它吗?

标签: scala maven jvm sbt xsbt


【解决方案1】:

这毕竟可能是一个与 Ivy 版本相关的错误。我使用的是 SBT 0.12.2,AFAIK 使用的是 Ivy 2.0。我正在查看位于~/.ivy2/cache/ 的 Ivy 缓存,Ivy 为它已解决的依赖项创建了一堆 XML 日志文件,我可以在生成的每个 XML 文件中看到 Ivy module version 2.0

我不知道如何更新 SBT 使用的 Ivy 版本,但从默认的 SBT 文档判断,一个可能的解决方案是手动升级 Ivy 并确保默认的机器范围路径指向正确的 Ivy 版本.

然后运行sbt cleansbt update 以重新获取依赖项并允许Ivy 为新的Ivy 版本重新生成XML 配置文件等。更多关于 SBT 依赖管理HERE:

常春藤主目录

默认情况下,sbt 使用标准的 Ivy 主目录位置 ${user.home}/.ivy2/。这可以在机器范围内配置,供以下人员使用 sbt 启动器和项目,通过设置系统属性 sbt 启动脚本中的 sbt.ivy.home(在设置中描述)。

例如:

java -Dsbt.ivy.home=/tmp/.ivy2/ ...

更新

通过查看最新版本的 SBT Scala 源代码,再次确认版本问题。甚至 SBT 0.13 似乎也在使用 Ivy 版本 2.0.0,而不是 2.3。查看 SBT 源代码,特别是 THIS 文件的最后几行。

【讨论】:

  • 我已经通过删除我的 ~/.ivy2 目录并运行 sbt clean 复制了您的观察结果。当它抓取 ivy 图书馆时,它会显示 org.apache.ivy#ivy;2.2.0!ivy.jar (542ms)。无论如何,我会将此作为 SBT 项目的错误提交。感谢您的帮助 alex23。
  • 我按照你说的做了覆盖,并将所有 ivy-2.3 重命名为 ivy-2.2,但是当我看到 delivering ivy file to /Users/me/my-lib/target/scala-2.10.1/ivy-2.1.22-SNAPSHOT.xml跑了sbt publish,它仍然提示我输入用户名/密码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-29
  • 1970-01-01
  • 2020-11-06
  • 1970-01-01
  • 2017-01-01
相关资源
最近更新 更多