我的问题是:为什么我不能通过 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 发布工作。”