SBT通过SSH密钥验证发布不起作用

时间:2013-04-21 21:41:38

标签: scala maven jvm sbt xsbt

我的问题是:为什么我不能通过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)。

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

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

上面的配置是否有问题?

可能的原因#2:从旧版本中击中Ivy bug

在撰写本文时,我使用的是最新的SBT,0.12.3。也许SBT使用的Ivy版本已经过时了。我想的越多,看起来就越不可能,但我还没能把它排除在外。

如何找出常春藤SBT的使用版本?

然后..

IF 它已经老了,有没有办法让SBT使用更新版本的常春藤?

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

[0] ivy ssh publisher

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

  • “好像我升级到ivy 2.3 rc-2 .SSH发布有效。”

1 个答案:

答案 0 :(得分:1)

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

我不知道如何更新SBT使用的常春藤版本,但是根据默认的SBT文档判断,可能的解决方案是手动升级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似乎都在使用常春藤版本2.0.0,而不是2.3。看一下SBT源代码,特别是THIS文件的最后几行。