【问题标题】:Self-modify the classpath within a Scala script?在 Scala 脚本中自行修改类路径?
【发布时间】:2010-03-21 17:11:58
【问题描述】:

我正在尝试用 Scala 脚本替换一堆 Linux shell 脚本。

剩下的挑战之一是如何扫描整个 JAR 目录并将它们放入类路径中。目前,这是在调用 scala JVM 之前在 shell 脚本中完成的。我想彻底消除shell脚本。

有没有一个优雅的 scala 习惯用法?

我发现了另一个问题,但在 Java 中似乎不值得搞砸它: How do you change the CLASSPATH within Java?

【问题讨论】:

    标签: linux scala shell


    【解决方案1】:

    JVM 本身在类路径中支持通配符表示法。如果/foo/bar 是一个存放JAR 文件的目录,并且您希望所有这些文件都在类路径中,则可以在类路径中包含/foo/bar/*,而不是单独枚举每个JAR 文件。

    我不确定这是否足以满足您的目的,但在合适的时候它会很方便。

    【讨论】:

    • 但这仅在JDK 1.6中实现
    【解决方案2】:

    嗯,这是直接支持的,你甚至不需要java支持。你试过了吗?

    scala -cp '/foo/bar/*'
    

    【讨论】:

    • 在 java 的 windows 版本中,您必须(不幸地)使用反斜杠。
    【解决方案3】:

    此脚本递归浏览lib 目录:

    import java.io.File
    import java.util.regex.Pattern
    
    def cp(root: File, lib: File): String = {
      var s = lib.getAbsolutePath.replaceFirst(
        Pattern.quote(root.getAbsolutePath) + File.separator + "*", "") +
        File.separator + "*"
      for (f <- lib.listFiles; if f.isDirectory)
        s += File.pathSeparator + cp(root, f)
      s
    }
    

    例如:

    /project
       lib
       |__dep
       |__dep2
         |__dep3
    

    你打电话:

    var f = new File("/path/to/project")
    cp(f, f)
    

    结果:

    /*:lib/*:lib/dep2/*:lib/dep2/dep3/*:lib/dep/*
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-01-05
      • 2019-08-31
      • 2011-05-04
      • 2014-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多