代码之家  ›  专栏  ›  技术社区  ›  Ismail H

从scala库中获取相对路径(在开发该库时)

  •  1
  • Ismail H  · 技术社区  · 6 年前

    我目前正在开发一个scala库,希望得到一个包含在其中的文件, 编译为Jar依赖项时发生的事件

    private val pathToDocker: Path = Paths.get("src", "main", "resources", "docker-compose")
    

    如何在导入的依赖项中查找我的文件?

    3 回复  |  直到 6 年前
        1
  •  3
  •   Tim    6 年前

    该文件将不在文件系统中,而是在已编译的JAR中。

    可以使用类加载器获取JAR资源。下面是一个如何在另一个代码库中实现这一点的示例。

    https://github.com/hail-is/hail/blob/6db198ae06/hail/src/main/scala/is/hail/utils/package.scala#L468

    用于加载版本信息的用法:

    https://github.com/hail-is/hail/blob/6db198ae06/hail/src/main/scala/is/hail/package.scala#L21

        2
  •  1
  •   pme    6 年前

    有一个 JarUtil -从…的回答 access-file-in-jar-file 翻译成 Scala :

      import java.util.jar.JarFile
    
      val jar = new JarFile("path_to_jar/shapeless_2.12-2.3.3.jar")
      val entry = jar.getEntry("shapeless/Annotation.class")
      val inStream = jar.getInputStream(entry)
    

    scala.io.Source.fromResource 仅适用于您的项目:

    Source.fromResource("tstdir/source.txt")

    确保文件位于 resources 目录,如:

    enter image description here

        3
  •  0
  •   Ismail H    6 年前

    我发现在jar依赖中获取路径的方法是创建一个singleton(scala对象),该对象具有加载文件的方法。由于它位于Jar内部,因此生成的路径是相对于Jar本身的。代码如下:

    object ClassLoaderTest {   
        def dockerFile: File = 
           new File(getClass.getClassLoader.getResource("docker/docker-compose.yml").getPath) 
    }
    

    从特征(或接口)调用时,结果路径为:

    jar:file:/home/myname/.ivy2/cache/com.mypackage/libraryname/jars/libraryname.libraryversion.jar!/docker/docker-compose.yml