在scala脚本文件中使用source的路径
我正在寻找一种方法来使用由…执行的* .
scala文件的完整路径
scala /path/to/file/file.scala 原因是在我的脚本中我想使用路径,这些路径相对于保存file.scala的位置.所以,假设我想在调用file.scala时调用file.scala中的/path/to/file/file_second.scala scala ./to./file/file.scala 因为我从/ path调用scala的目录(即System.getProperty(“user.dir”)将返回的内容).我所知道的是,file_second.scala与file.scala位于同一目录中而实际上并不知道完整路径. 我试过了.其中,getClass.getResource(“”).split(“:”)(1),但这将是 我想必须有一个干净的解决方案,因为scala -savecompiled将在我想要处理的目录中创建一个* .jar,但我无法弄清楚如何……:/ 非常感谢任何帮助. 解决方法
以下脚本将打印它的文件系统路径.连续尝试了三种不同的方法,直到其中一种方法成功.
import java.io.File printf("[%s]n",new File(getScriptName).getCanonicalPath) System.exit(0) def getScriptName:String = { // this approach works on the sun jvm: val jcmd = System.getProperty("sun.java.command","") jcmd.split("""s+""").toList.reverse.head match { case name if new File(name).exists => name case _ => // for this to work,you need to set -Dscala.script.name at script launch System.getProperty("scala.script.name","") match { case name if new File(name).exists => name case _ => // last resort: derive script basename from stackdump val basename = { val filenames = new RuntimeException("").getStackTrace.map { it => it.getFileName } filenames.indexOf("NativeMethodAccessorImpl.java") match { case -1 => filenames.reverse.head case num => filenames(num - 1) } } // then search the system PATH for the script file import scala.collection.JavaConversions._ val sep = System.getProperty("path.separator") val path = System.getenv("PATH").split(sep) path.map(new File(_,basename)).find( _.exists ) match { case Some(scriptfile) => scriptfile.getCanonicalPath case _ => basename // better than nothing } } } } 最简单,最便携的是第二种方法,它取决于使用包装器脚本,如下例所示,用于在调用$SCALA_HOME / bin / scala之前定义属性’scala.script.name’.当然,封装脚本需要在$SCALA_HOME / bin之前的PATH中.结果更加防弹,但仅适用于脚本. #!/usr/bin/env sh for SCRIPT_NAME; do true ; done # set SCRIPT_NAME to the last argument JAVA_OPTS="$JAVA_OPTS -Dscala.script.name=${SCRIPT_NAME}" $SCALA_HOME/bin/scala "$@" 在scala启动器周围使用此包装器可简化以下操作: #!/usr/bin/env scala !# printf("%sn",System.getProperty("scala.script.name")) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |