gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 11:48:03 24 4
gpt4 key购买 nike

我想做的是在开始时定义 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 中使用的类型。

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

  1. sbt 值(value)观是预先考虑好的。它们不是我无法设置 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]'
}

这是使用它的代码片段(稍后在同一文件中),确保我们可以访问 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 不允许条目中有空行。为了避免这种情况,我在需要一些空白的地方使用了缩进的 // 行。

关于scala - 如何在 sbt 中检测 JavaFX 运行时 jar,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14123749/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com