我目前正在开发一个Scala库,并希望获取其中的文件,当编译为Jar依赖项时会发生事件。问题是,当从导入了库的另一个项目执行时,路径是相对于该项目的。这是获取文件的代码:
private val pathToDocker: Path = Paths.get("src", "main", "resources", "docker-compose")
如何在导入的依赖项中查找我的文件?
答案 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
目录中,例如:
答案 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)
}