3

私がやりたいjavaHomeのは、最初に、環境変数から、またはデフォルトとして固定文字列から定義することです。その後、その文字列を使用します。

これは私が試したことです:

javaHome := Some(file("/Library/Java/JavaVirtualMachines/jdk1.7.0_10.jdk/Contents/Home"))

以降

unmanagedJars in Compile <+= (javaHome) { fn => Attributed.blank( fn + "/jre/lib/jfxrt.jar") }

[リファレンス][1]を読み込もうとしましたが、Scala自体よりも実際には複雑です。助けてください。

ビルドファイルの途中に固定文字列を含めることでこれを回避できますが、一般的には好きではありません。

プラットフォームはOSX、sbt 0.12.1、JDK 7u10、Scala2.9.2です。

編集: 解決策を見つけたので、混乱するだけなので、エラーメッセージとさらに2回の(失敗した)試行を削除しました。

4

2 に答える 2

5

これがついに完了しました。問題の一部は、sbt値モデル(およびカスタム演算子の純粋な乱用!)を理解すること、一部はsbtで使用される型を理解することにあるようです。

それに応じて質問を編集しますが、ここに私の調査結果(および解決策)があります。

  1. sbt値は事前に調整されています。設定できないような変数ではありませんmyOwn。はjavaHomesbtの既知の値(または実際にはタスク?)です。

  2. そうは言っても、なぜsbtが私に適したJDKを見つけるのに良い仕事をすることができないのだろうか。しかたがない。

ヒント:の使用val xxx: Nothing = expressionは、さまざまなものの種類を見つけるための優れたツールです。タイプのインスタンスを持つことはできないNothingため、常に失敗し、の(不明な)タイプを通知する素晴らしいエラーメッセージが表示されますexpression

これが私のjavaHome検出コードです(からbuild.sbt):

//---
// Note: Wouldn't 'sbt' be able to provide us a nice default for this (the following logic
//      would deserve to be automatic, not in a project build script). AK 4-Jan-2013
//
javaHome := {
  var s = System.getenv("JAVA_HOME")
  if (s==null) {
    // tbd. try to detect JDK location on multiple platforms
    //
    // OS X: "/Library/Java/JavaVirtualMachines/jdk1.xxx.jdk/Contents/Home" with greatest id (i.e. "7.0_10")
    //
    s= "/Library/Java/JavaVirtualMachines/jdk1.7.0_10.jdk/Contents/Home"
  }
  //
  val dir = new File(s)
  if (!dir.exists) {
    throw new RuntimeException( "No JDK found - try setting 'JAVA_HOME'." )
  }
  //
  Some(dir)  // 'sbt' 'javaHome' value is ': Option[java.io.File]'
}

jfxrt.jarそして、これを使用するスニペット(後で同じファイル内)があり、 (JavaFX 2.xランタイム)にアクセスできることを確認します。Oracle(またはsbt)は、とにかくこれをクラスパスに含める必要があります。これにより、これらすべてを回避できます。

//---
// JavaFX
//
// Note: We shouldn't even need to say this at all. Part of Java 7 RT (since 7u06) and should come from there (right)
//      The downside is that now this also gets into the 'one-jar' .jar package (where it would not need to be,
//      and takes 15MB of space - of the 17MB package!) AKa 1-Nov-2012
//
unmanagedJars in Compile <+= javaHome map { jh /*: Option[File]*/ =>
  val dir: File = jh.getOrElse(null)    // unSome
  //
  val jfxJar = new File(dir, "/jre/lib/jfxrt.jar")
  if (!jfxJar.exists) {
    throw new RuntimeException( "JavaFX not detected (needs Java runtime 7u06 or later): "+ jfxJar.getPath )  // '.getPath' = full filename
  }
  Attributed.blank(jfxJar)
} 

sbtは、エントリ内に空の行を許可しないことに注意してください。これを回避するために、//空白が必要な場所にインデントされた線を使用しました。

于 2013-01-04T12:26:13.500 に答える
0

<+=実際には「コレクション」設定に追加するためのものであり、文字列の連結ではサポートされていないと思います。さらに、2回目の試行では、代入演算子(<+=介して連結しようとしていることと、演算子を使用して手動で連結しようとしていることの両方を試みていますが+、これは確かに意図したものではありません。に置き換えるだけで、sbt<+=<<=幸せになります。

unmanagedJars in Compile <<= javaHome map { jh => jh + "/jre/lib/jfxrt.jar" }

更新:私はあなたの投稿を読み間違え、完全に間違っていたことが判明しました。<+=unamanagedJarに追加するために使用するのは正しいこと+であり、絶対ファイルパスを作成するためだけに使用されていました。申し訳ありませんが、その試合。今回は手元のsbtで実際に修正しようとしましたが、なんとかコンパイルできました。実際のプロジェクトに対して実際にテストしたわけではありませんが、実際にテストして、期待どおりに機能するかどうかを報告します。

unmanagedJars in Compile <+= javaHome map { jh => Attributed.blank( new File( jh.getOrElse(sys.error("Error, could not get java home")),"jre/lib/jfxrt.jar" ) ) }

これは明らかにあまり良くありませんが、読みやすくするためのヘルパーがどこかにあるかもしれません。

于 2013-01-02T16:40:32.497 に答える