我想做的是在开始时定义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") }
我试过阅读[reference][1],但它真的比Scala本身更复杂。请帮助。
我可以通过在构建文件中间放置一个固定字符串来绕过这个问题,但通常我不喜欢这样。平台为OS X, sbt 0.12.1, JDK 7u10, Scala 2.9.2
编辑:既然我找到了解决方案,我已经删除了错误消息和两次(不成功的)尝试,因为它们只会混淆。
终于搞定了。似乎问题部分在于理解sbt值模型(以及它对自定义操作符的过度使用!),部分在于理解sbt中使用的类型。
我会相应地修改问题,但这里是我的发现(和解决方案)。
-
sbt值是预先考虑的。它们不是变量,我不能设置
myOwn
。 说了这么多,我想知道为什么sbt不能很好地为我找到一个合适的JDK。哦,好吧。
javaHome
是一个已知值(或者实际上是一个任务?)提示:使用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. c .)。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不允许在条目中出现空行。为了避免这种情况,我使用缩进的//
行,我想要一些空白。
<+=
实际上是用于附加到"集合"设置,我认为它不支持字符串连接。另外,在第二次尝试中,您都试图通过赋值操作符(<+=
) 和使用+
操作符手工连接进行连接,这当然不是您想要的。只要将<+=
替换为<<=
,它应该会让sbt高兴。
unmanagedJars in Compile <<= javaHome map { jh => jh + "/jre/lib/jfxrt.jar" }
UPDATE:原来我误读了你的帖子,完全错了。使用<+=
追加到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" ) ) }
这显然不是很好,但可能有一些帮助,使其更易于阅读。