【问题标题】:scala get path for current module, not of the calling modulescala 获取当前模块的路径,而不是调用模块的路径
【发布时间】:2022-12-11 15:56:11
【问题描述】:

在 intelliJ 项目中,导入了“otherModule”。

一个模块中的“Main 方法”调用位于“otherModule”中的“某些方法”

“otherModule”包含资源,调用模块需要获取路径。

什么代码可以用来获取“otherModule”的路径,而不是返回调用模块的路径?

例如,如果“otherModule”包含代码: var thisModulePath = getClass.getResource("/").getPath

它实际上返回调用模块的路径。

【问题讨论】:

  • 使用getResources,就像获取列表一样。你将在构建工具、超级 JAR 和 dockerized 应用程序中有不同的类路径,所以最好不要让你的代码依赖于它是如何组织到文件夹/JAR 中的。
  • 您真的需要资源路径吗?否则 getResourceAsStream 可能更合适,这样您就不必关心路径。如上所述,根据您的代码运行方式,路径可能会非常不同,因此取决于您对路径所做的操作,它不能是可移植代码。
  • getResources 或 getResourceAsStream 肯定只会在原始模块中找到资源吗?与被调用模块中存在的资源无关?

标签: scala


【解决方案1】:

在 JVM 上,资源由类加载器加载。哪个类加载器由您使用的 Class 实例决定。

例如:

// use the class loader which loaded the current class
getClass.getResourceAsStream("/resource.txt")

// use the class loader which loaded the class ClassInOtherModule
classOf[ClassInOtherModule].getResourceAsStream("/resource.txt")

每个类加载器都可以找到自己的一组资源。然而,在实践中,独立程序(所以不是 Spark,也不是应用程序容器)对所有东西都使用一个类加载器,所以大多数时候它并不重要。

“找到模块的路径”并不是真正的事情。模块是编译时概念,大部分不会转换为运行时。

【讨论】:

    猜你喜欢
    • 2018-03-30
    • 2018-06-04
    • 2014-10-14
    • 1970-01-01
    • 2012-02-17
    • 1970-01-01
    • 2020-02-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多