Java Can';无法从jar获取资源

Java Can';无法从jar获取资源,java,scala,resources,Java,Scala,Resources,在我的项目中,我需要从参考资料中的文件夹中获取JSON。为此,我实现了以下方法: protected def getListOfJsonFromResources(path: String): List[String] = { val source = Source.fromInputStream(Thread.currentThread().getContextClassLoader.getResourceAsStream(path)) println(source) val li

在我的项目中,我需要从参考资料中的文件夹中获取JSON。为此,我实现了以下方法:

protected def getListOfJsonFromResources(path: String): List[String] = {
  val source = Source.fromInputStream(Thread.currentThread().getContextClassLoader.getResourceAsStream(path))
  println(source)
  val list = source.getLines().map{file =>
    Source.fromInputStream(Thread.currentThread().getContextClassLoader.getResourceAsStream(path + file))
      .mkString
  }.toList
  source.close()
  list
}
它在IDE中工作正常,但在运行jar时不返回任何内容。 我知道问题出在
val source
中,因为在jar中它返回空迭代器。 我已经尝试使用
this.getClass().getResourceAsStream()
this.getClass().getClassLoader().getResourceAsStream()
,并将此方法重写为java方法

我在Idea中生成JAR(构建>构建工件>构建)。此文件位于JAR中,路径正确。 我使用ApacheMaven3.6.3 我的res文件夹:resources/folder/json/jsonFolder路径:folder/json/jsonFolder/

如何更改此方法以从给定文件夹获取JSON列表


提前谢谢。

正确的用法实际上是
MyClass.class.getResourceAsStream
。毕竟,
getClass().getRAS()。然而,我认为不是这样的——因此,更改将改进此代码的样式并在将来证明它,但它可能不会直接解决问题

MyClass.class.getRAS
所做的是查看
MyClass.class
文件所在的位置。例如,如果您有一个带有以下内容的jar:

META-INF/MANIFEST.MF
com/foo/app/MyClass.class
app-icon.png
com/foo/app/save.png
然后运行MyClass,
MyClass.class.gRAS(“save.png”)
就可以了。正如weill
MyClass.class.gRAS(“/app-icon.png”)
-注意前面的斜杠

因此,如果gRAS不适用于您,那么结论是您指定的路径错误,或者您需要包含在应用程序中的文件未包含在构建工具中

您还没有展示构建脚本中的任何相关内容,因此关于如何修复这一问题,没有什么好说的。但我可以为您提供调试问题所需的工具,以便您可以使用以下有用的技巧自行修复问题:

MyClass.class.getResource("MyClass.class")
为任何班级工作。打印它(
System.out.println
上面调用的URL),您将看到URL,它准确地告诉您MyClass的许多变体中的哪一个确实在使用(通过IDE的build-on-save,通过sbt的构建工具,通过sbt在dist阶段生成的jar文件,谁知道磁盘上还有多少呢!)

现在使用标准的计算机工具(Mac:Finder、windows:Explorer或仅使用命令行)导航到实际位置并检查此资源文件是否存在。请注意,jar文件只是zip文件;
unzip-l somejar.jar
在这里很有用

如果您看到该文件,那么,现在您知道该文件相对于
MyClass.class
的位置,现在您知道向
gRAS
调用提供什么。请注意,
不是一个好主意;如果它与您的类不在同一目录中,也不在任何子目录中,则使用前导斜杠去掉jar文件或类的“根”路径根目录

如果您没有看到该文件,那么,现在您知道您的构建已被破坏。请搜索web(或在此单独提问)关于如何解决这个问题,现在您不需要重复构建和运行整个应用程序来解决这个问题;您只需继续扫描构建工具生成的jar文件,直到资源文件显示在正确的位置


注意:ClassLoader.getSystemCLassLoader.getResource,getThreadContext().getResource,getClass().getResource-这些都是错误的。不要这样做。它可能也会工作,但它的代码更多,在各种情况下都会中断。
MyClass.class.getResource
完全符合您的需要,是惯用的,并且是最短的表单之一。

您是如何生成JAR文件的?您检查过文件是否确实在JAR?你的
资源
文件夹是什么样子的?你传递的
路径是什么?你的sbt版本是什么?谢谢你的回答。我尝试了你的技巧,但没有成功。我知道jar中资源的有效路径,但getResource没有识别出这个路径。现在看来我不会在project中实现这个功能。