これがついに完了しました。問題の一部は、sbt値モデル(およびカスタム演算子の純粋な乱用!)を理解すること、一部はsbtで使用される型を理解することにあるようです。
それに応じて質問を編集しますが、ここに私の調査結果(および解決策)があります。
sbt値は事前に調整されています。設定できないような変数ではありませんmyOwn
。はjavaHome
sbtの既知の値(または実際にはタスク?)です。
そうは言っても、なぜ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は、エントリ内に空の行を許可しないことに注意してください。これを回避するために、//
空白が必要な場所にインデントされた線を使用しました。