2

我的问题是:为什么我不能通过 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 ssh publisher,它引用 [0]导致.java.awt.HeadlessExceptions

[0] ivy ssh 发布者

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

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

4

1 回答 1

1

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

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

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

常春藤家庭目录

默认情况下,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文件的最后几行。

于 2013-04-22T11:00:43.777 回答