首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >正则表达式中的某些东西破坏了我的build.sbt脚本(SBT0.13,Scala2.10.2)

正则表达式中的某些东西破坏了我的build.sbt脚本(SBT0.13,Scala2.10.2)
EN

Stack Overflow用户
提问于 2013-09-23 23:54:23
回答 2查看 579关注 0票数 2

我在build.sbt脚本中有一个函数可以自动检测OS上最新的Java Runtime。这个功能工作得很好,直到一些更新(sbt或Scala)不再喜欢它。我甚至不能执行sbt clean,但得到了一个错误(如下所示)。

该函数是(只需将此代码粘贴到build.sbt并运行sbt clean即可对其进行测试-代码不需要执行):

代码语言:javascript
复制
javaHome := {
  var s = System.getenv("JAVA_HOME")
  if (s==null) {
    // Try to detect the latest JDK
    //
    // OS X: "/Library/Java/JavaVirtualMachines/jdk1.xxx.jdk/Contents/Home" with greatest id (i.e. "7.0_11")
    // Linux: tbd
    // Windows: tbd
    //
    val base= new File("/Library/Java/JavaVirtualMachines")
    assert( base.isDirectory, "Java JDKs not found at: "+ base )
    //
    // Get the latest version number available
    //
    // Note: JDK 7 has i.e. "jdk1.7.0_11.jdk"
    //       JDK 8 (early access) has "jdk1.8.0.jdk" (no underscore)
    //
    // For re explanation, see: http://stackoverflow.com/questions/8213837/optional-grouping-in-scala-regular-expressions
    // Triple quotes """ means '\' does not need to be escaped.
    //
    val re = """^jdk(\d+)\.(\d+)\.(\d+)(?:_([\d]*))?\.jdk$""".r
    var best = 0  // latest version so far
    base.listFiles.filter(_.isDirectory).map( (f: File) => {    // 'dir.name' i.e. "jdk1.7.0_11.jdk", "jdk1.8.0.jdk"
      try {
        val re(a,b,c,d) = f.name    // unapplies the caught parts
        val abcd= (((a.toInt)*100 + b.toInt)*100 + c.toInt)*100 + (Option(d) getOrElse "0").toInt
        println( "Found JVM: ", a, b, c, d )
        if (b=="8") {
          throw new RuntimeException( "Cannot use JavaFX 8 due to ScalaFX: please set 'JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.7.xxx.jdk/Contents/Home' env.var." )
        } else if (abcd>best) {
          best= abcd
          s= base+"/"+f.name+"/Contents/Home/"   // postfix in OS X
        }
      } catch { 
        // not really supposed to be having non-matching directories there (just skip them)
        case e: MatchError => None
      }
    } )
    //
    if (s==null) {
      throw new RuntimeException( "No JDK found at: "+ base )
    }
  }
  //
  println( "*** Using Java JDK: "+ s )
  val dir = new File(s)
  if (!dir.isDirectory) {
    throw new RuntimeException( "No JDK found at: "+ s )
  }
  //
  Some(dir)  // 'sbt' 'javaHome' value is ': Option[java.io.File]'
}

我运行这段代码的原因是:

代码语言:javascript
复制
$ sbt clean
[info] Loading project definition from /Users/asko/Hg/ScalaSim/project
**error: symbol value re does not exist in $cdeec6b653504a14ad9f.$sbtdef**
[error] scala.reflect.internal.FatalError: 
[error]      while compiling: /Users/asko/Hg/ScalaSim/build.sbt
[error]         during phase: icode
[error]      library version: version 2.10.2
[error]     compiler version: version 2.10.2
[error]   reconstructed args: -classpath /Users/asko/Hg/ScalaSim/project/target/scala-2.10/sbt-0.13/classes:/Users/asko/.ivy2/cache/scala_2.10/sbt_0.13/com.github.retronym/sbt-onejar/jars/sbt-onejar-0.8.jar:/Users/asko/.ivy2/cache/scala_2.10/sbt_0.13/com.eed3si9n/sbt-assembly/jars/sbt-assembly-0.9.1.jar:/Users/asko/.sbt/boot/scala-2.10.2/org.scala-sbt/sbt/0.13.0/actions-0.13.0.jar:/Users/asko/.sbt/boot/scala-2.10.2/org.scala-sbt/sbt/0.13.0/api-0.13.0.jar:/Users/asko/.sbt/boot/scala-2.10.2/org.scala-sbt/sbt/0.13.0/apply-macro-0.13.0.jar:/Users/asko/.sbt/boot/scala-2.10.2/org.scala-sbt/sbt/0.13.0/cache-0.13.0.jar:/Users/asko/.sbt/boot/scala-2.10.2/org.scala-sbt/sbt/0.13.0/classfile-0.13.0.jar:/Users/asko/.sbt/boot/scala-2.10.2/org.scala-sbt/sbt/0.13.0/classpath-0.13.0.jar:/Users/asko/.sbt/boot/scala-2.10.2/org.scala-sbt/sbt/0.13.0/collections-0.13.0.jar:/Users/asko/.sbt/boot/scala-2.10.2/org.scala-sbt/sbt/0.13.0/command-0.13.0.jar:/Users/asko/.sbt/boot/scala-2.10.2/org.scala-sbt/sbt/0.13.0/compile-0.13.0.jar:/Users/asko/.sbt/boot/scala-2.10.2/org.scala-sbt/sbt/0.13.0/compiler-integration-0.13.0.jar:/Users/asko/.sbt/boot/scala-2.10.2/org.scala-sbt/sbt/0.13.0/compiler-ivy-integration-0.13.0.jar:/Users/asko/.sbt/boot/scala-2.10.2/org.scala-sbt/sbt/0.13.0/completion-0.13.0.jar:/Users/asko/.sbt/boot/scala-2.10.2/org.scala-sbt/sbt/0.13.0/control-0.13.0.jar:/Users/asko/.sbt/boot/scala-2.10.2/org.scala-sbt/sbt/0.13.0/cross-0.13.0.jar:/Users/asko/.sbt/boot/scala-2.10.2/org.scala-sbt/sbt/0.13.0/incremental-compiler-0.13.0.jar:/Users/asko/.sbt/boot/scala-2.10.2/org.scala-sbt/sbt/0.13.0/io-0.13.0.jar:/Users/asko/.sbt/boot/scala-2.10.2/org.scala-sbt/sbt/0.13.0/ivy-0.13.0.jar:/Users/asko/.sbt/boot/scala-2.10.2/org.scala-sbt/sbt/0.13.0/ivy-2.3.0-rc1.jar:/Users/asko/.sbt/boot/scala-2.10.2/org.scala-sbt/sbt/0.13.0/jline-2.11.jar:/Users/asko/.sbt/boot/scala-2.10.2/org.scala-sbt/sbt/0.13.0/jsch-0.1.46.jar:/Users/asko/.sbt/boot/scala-2.10.2/org.scala-sbt/sbt/0.13.0/launcher-interface-0.13.0.jar:/Users/asko/.sbt/boot/scala-2.10.2/org.scala-sbt/sbt/0.13.0/logging-0.13.0.jar:/Users/asko/.sbt/boot/scala-2.10.2/org.scala-sbt/sbt/0.13.0/main-0.13.0.jar:/Users/asko/.sbt/boot/scala-2.10.2/org.scala-sbt/sbt/0.13.0/main-settings-0.13.0.jar:/Users/asko/.sbt/boot/scala-2.10.2/org.scala-sbt/sbt/0.13.0/persist-0.13.0.jar:/Users/asko/.sbt/boot/scala-2.10.2/org.scala-sbt/sbt/0.13.0/process-0.13.0.jar:/Users/asko/.sbt/boot/scala-2.10.2/org.scala-sbt/sbt/0.13.0/relation-0.13.0.jar:/Users/asko/.sbt/boot/scala-2.10.2/org.scala-sbt/sbt/0.13.0/run-0.13.0.jar:/Users/asko/.sbt/boot/scala-2.10.2/org.scala-sbt/sbt/0.13.0/sbinary_2.10-0.4.2.jar:/Users/asko/.sbt/boot/scala-2.10.2/org.scala-sbt/sbt/0.13.0/sbt-0.13.0.jar:/Users/asko/.sbt/boot/scala-2.10.2/org.scala-sbt/sbt/0.13.0/scala-reflect-2.10.2.jar:/Users/asko/.sbt/boot/scala-2.10.2/org.scala-sbt/sbt/0.13.0/task-system-0.13.0.jar:/Users/asko/.sbt/boot/scala-2.10.2/org.scala-sbt/sbt/0.13.0/tasks-0.13.0.jar:/Users/asko/.sbt/boot/scala-2.10.2/org.scala-sbt/sbt/0.13.0/test-agent-0.13.0.jar:/Users/asko/.sbt/boot/scala-2.10.2/org.scala-sbt/sbt/0.13.0/test-interface-1.0.jar:/Users/asko/.sbt/boot/scala-2.10.2/org.scala-sbt/sbt/0.13.0/testing-0.13.0.jar:/Users/asko/.sbt/boot/scala-2.10.2/org.scala-sbt/sbt/0.13.0/tracking-0.13.0.jar:/Users/asko/.sbt/boot/scala-2.10.2/org.scala-sbt/sbt/0.13.0/xsbti/interface-0.13.0.jar:/Users/asko/.sbt/boot/scala-2.10.2/lib/jansi.jar:/Users/asko/.sbt/boot/scala-2.10.2/lib/jline.jar:/Users/asko/.sbt/boot/scala-2.10.2/lib/scala-compiler.jar:/Users/asko/.sbt/boot/scala-2.10.2/lib/scala-library.jar:/Users/asko/.sbt/boot/scala-2.10.2/lib/scala-reflect.jar:/Users/asko/Hg/ScalaSim/project/target/config-classes
[error] 
[error]   last tree to typer: Ident(re$1)
[error]               symbol: value re$1 (flags: <param> <synthetic> <triedcooking>)
[error]    symbol definition: re$1: util.matching.Regex
[error]                  tpe: util.matching.Regex
[error]        symbol owners: value re$1 -> constructor $cdeec6b653504a14ad9f$$anonfun$$sbtdef$1 -> anonymous class sbtdef$1 -> package <empty>
[error]       context owners: anonymous class sbtdef$1 -> package <empty>
[error] 
[error] == Enclosing template or block ==
[error] 
...
[error] 
[error] == Expanded type of tree ==
[error] 
[error] TypeRef(TypeSymbol(class Regex extends Serializable))
[error] 
[error] symbol value re does not exist in $cdeec6b653504a14ad9f.$sbtdef
[error] Use 'last' for the full log.
Project loading failed: (r)etry, (q)uit, (l)ast, or (i)gnore? 

有人能告诉我这是怎么回事吗?是我还是sbt?

EN

回答 2

Stack Overflow用户

发布于 2013-09-24 00:51:01

我认为sbt 0.13的宏处理(或一般的宏)中有一个bug。去掉val re,它可以很好地工作:

代码语言:javascript
复制
val re = """^jdk(\d+)\.(\d+)\.(\d+)(?:_([\d]*))?\.jdk$""".r

javaHome := {
  var s = System.getenv("JAVA_HOME")
  if (s==null) {
    // Try to detect the latest JDK
    //
    // OS X: "/Library/Java/JavaVirtualMachines/jdk1.xxx.jdk/Contents/Home" with greatest id (i.e. "7.0_11")
    // Linux: tbd
    // Windows: tbd
    //
    val base= new File("/Library/Java/JavaVirtualMachines")
    assert( base.isDirectory, "Java JDKs not found at: "+ base )
    //
    // Get the latest version number available
    //
    // Note: JDK 7 has i.e. "jdk1.7.0_11.jdk"
    //       JDK 8 (early access) has "jdk1.8.0.jdk" (no underscore)
    //
    // For re explanation, see: http://stackoverflow.com/questions/8213837/optional-grouping-in-scala-regular-expressions
    // Triple quotes """ means '\' does not need to be escaped.
    //
    var best = 0  // latest version so far
    base.listFiles.filter(_.isDirectory).map( (f: File) => {    // 'dir.name' i.e. "jdk1.7.0_11.jdk", "jdk1.8.0.jdk"
      try {
        val re(a,b,c,d) = f.name    // unapplies the caught parts
        val abcd= (((a.toInt)*100 + b.toInt)*100 + c.toInt)*100 + (Option(d) getOrElse "0").toInt
        println( "Found JVM: ", a, b, c, d )
        if (b=="8") {
          throw new RuntimeException( "Cannot use JavaFX 8 due to ScalaFX: please set 'JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.7.xxx.jdk/Contents/Home' env.var." )
        } else if (abcd>best) {
          best= abcd
          s= base+"/"+f.name+"/Contents/Home/"   // postfix in OS X
        }
      } catch { 
        // not really supposed to be having non-matching directories there (just skip them)
        case e: MatchError => None
      }
    } )
    //
    if (s==null) {
      throw new RuntimeException( "No JDK found at: "+ base )
    }
  }
  //
  println( "*** Using Java JDK: "+ s )
  val dir = new File(s)
  if (!dir.isDirectory) {
    throw new RuntimeException( "No JDK found at: "+ s )
  }
  //
  Some(dir)  // 'sbt' 'javaHome' value is ': Option[java.io.File]'
}

下面是我得到的信息:

代码语言:javascript
复制
*** Using Java JDK: /Library/Java/Home/
票数 2
EN

Stack Overflow用户

发布于 2013-09-24 00:49:59

这是sbt。

非常有趣!SBT 0.13转移到使用宏,所以它可以简化声明,但您已经偶然发现了一些因此而停止工作的东西。请将此报告为SBT上的错误。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18963676

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档