如何在sbt中检测JavaFX运行时jar

aka*_*ppi 3 scala sbt javafx-2

我想要做的是javaHome在开始时定义,从环境变量或固定字符串作为默认值.然后,我会使用那个字符串.

这就是我尝试过的:

javaHome := Some(file("/Library/Java/JavaVirtualMachines/jdk1.7.0_10.jdk/Contents/Home"))
Run Code Online (Sandbox Code Playgroud)

然后

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

我试过阅读[参考] [1]但它确实比Scala本身更复杂.请帮忙.

我可以通过在构建文件中间使用固定字符串来绕过这一点,但通常我不喜欢这样.

平台是OS X,sbt 0.12.1,JDK 7u10,Scala 2.9.2

编辑: 因为我找到了一个解决方案,我已经删除了错误消息和另外两个(不成功)尝试,因为他们只会混淆.

aka*_*ppi 5

终于完成了这件事.似乎问题部分在于理解sbt值模型(及其纯粹过度使用自定义运算符!),部分原因在于与sbt中使用的类型达成一致.

我将相应地编辑问题,但这是我的发现(和解决方案).

  1. sbt值是预先打坐的.它们不是我无法设置的变量myOwn.这javaHome是sbt的已知值(或实际上是一个任务?).

  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]'
}
Run Code Online (Sandbox Code Playgroud)

以下是使用它的片段(稍后在同一文件中),确保我们可以访问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)
} 
Run Code Online (Sandbox Code Playgroud)

请注意,sbt不允许条目中的空行.为了避免这种情况,我使用了缩进//线,我想要一些空白区域.