配置Scala工作表的工作目录

时间:2013-05-08 18:14:28

标签: scala worksheet scala-ide

我希望Scala工作表(和Scala解释器)的工作目录是Eclipse项目路径而不是Eclipse安装目录。我怎样(非编程)实现这一目标?

我知道我可以使用System.setProperty("user.dir", "..."),但恕我直言,不属于代码。此外,它似乎不起作用:

object ScratchWS {
  System.setProperty("user.dir", "C:\\")          //> res0: String = C:\adt-bundle-windows-x86_64-20130219\eclipse
  new File("putty.exe").exists()                  //> res1: Boolean = false

  new File("C:\\putty.exe").exists()              //> res2: Boolean = true
}

1 个答案:

答案 0 :(得分:7)

从Scala Worksheet 0.2.1开始,无法控制工作表工作目录。

出于安全原因,一旦JVM运行,就不能(直接)更改JVM的工作原理。有关详细信息,请参阅Changing the current working directory in Java?

因此,通常最好始终指定完全限定的路径,或者从完全限定的“锚点”指定相对路径。

我想出了一个在Scala工作表中获得这样一个“锚点”的黑客攻击

object WorksheetProjectDirHack {
    // Yuck.... See: https://github.com/scala-ide/scala-worksheet/issues/102
    import Properties._
    val pathSep = propOrElse("path.separator", ":")
    val fileSep = propOrElse("file.separator", "/")
    val projectDir = javaClassPath.split(pathSep).
        filter(_.matches(".*worksheet.bin$")).head.
        split(fileSep).dropRight(2).mkString(fileSep)

    val otherProjectFile = new File(projectDir, "src/main/resources/data.bin")
}

它基本上是通过利用Eclipse项目目录中创建的.worksheet/bin目录的存在并附加到Scala Worksheet类路径来实现的。