2

私の質問は: SBT から自分のサーバーに SSH 経由で公開できないのはなぜですか?

環境:

私は scala ライブラリを開発しており、SSH (SFTP リゾルバを使用) 経由で SBT v0.12.3 を使用してリモート リポジトリに公開したいと考えています。私の project/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]アイビー ssh パブリッシャー

  • "Ivy のどのバージョンを使用していますか? バージョン 2.0 の Jira バグがあります: issues.apache.org/jira/browse/IVY-783は今すぐ修正する必要があります。"

  • 「ivy 2.3 rc-2 にアップグレードすると、SSH パブリッシュが機能するようです。」

4

1 に答える 1

1

結局、Ivy のバージョン関連のバグかもしれません。AFAIKがIvy 2.0を使用しているSBT 0.12.2を使用しています。にある Ivy キャッシュを見てい~/.ivy2/cache/ます。Ivy は、解決した依存関係の一連の XML ログ ファイルを作成しmodule version 2.0ます。生成されたすべての XML ファイルで Ivy を確認できます。

SBT で使用される Ivy バージョンを更新する方法はわかりませんが、デフォルトの SBT ドキュメントから判断すると、考えられる解決策は Ivy を手動でアップグレードし、デフォルトのマシン全体のパスが正しい Ivy バージョンを指していることを確認することです。

次にsbt cleanorsbt updateを実行して依存関係を再取得し、Ivy が新しい Ivy バージョンの XML 構成ファイルなどを再生成できるようにします。SBT 依存関係管理の詳細はこちら:

Ivy ホーム ディレクトリ

デフォルトでは、sbt は標準の Ivy ホーム ディレクトリの場所 ${user.home}/.ivy2/ を使用します。これは、sbt 起動スクリプト (セットアップで説明) でシステム プロパティ sbt.ivy.home を設定することにより、sbt ランチャーとプロジェクトの両方で使用するために、マシン全体で構成できます。

例えば:

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

アップデート

SBT Scala ソース コードの最新バージョンを確認すると、バージョンの問題が再度確認されます。SBT 0.13 でさえ、2.3 ではなく、Ivy バージョン 2.0.0 を使用しているようです。SBT ソース コード、特にこのファイルの最後の数行を見てください。

于 2013-04-22T11:00:43.777 に答える