加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

在scala脚本文件中使用source的路径

发布时间:2020-12-16 18:07:52 所属栏目:安全 来源:网络整理
导读:我正在寻找一种方法来使用由…执行的* . scala文件的完整路径 scala /path/to/file/file.scala 原因是在我的脚本中我想使用路径,这些路径相对于保存file.scala的位置.所以,假设我想在调用file.scala时调用file.scala中的/path/to/file/file_second.scala sca
我正在寻找一种方法来使用由…执行的* . 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),但这将是
return /path/./或/tmp/scala.tmp/

我想必须有一个干净的解决方案,因为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"))

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读