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

时间:2018-11-27 15:52:08

标签: scala

我目前正在开发一个Scala库,并希望获取其中的文件,当编译为Jar依赖项时会发生事件。问题是,当从导入了库的另一个项目执行时,路径是相对于该项目的。这是获取文件的代码:

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

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

3 个答案:

答案 0 :(得分:3)

该文件将不在文件系统中-它将在已编译的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

答案 1 :(得分:1)

有一个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

答案 2 :(得分:0)

我发现获得jar依赖关系内部路径的方法是创建一个单例(scala对象),该类具有一种加载文件的方法。由于它在Jar中,因此生成的路径是相对于jar本身的。这是代码:

$(document).ready(function () {
    let tableNum = 1;
    var tableOneOrder = [];
    var chefTable = [];
    tableOneOrder.forEach(function (element) { element.quantity = "0"; });
    $('#submitForm').click(function(event){
        event.preventDefault;

        $.ajax('/api/orders/',{
            method: 'PUT',
            data: chefTable
        }).then(function(){
            console.log(chefTable[chefTable.length-1]);
           // location.reload();
        });
    });

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

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