【发布时间】: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。
“您使用的是哪个版本的 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给你足够的信息来恢复它吗?