【问题标题】:How can i access files in src/main/resources dynamically when the project is a .jar or in IDE当项目是 .jar 或在 IDE 中时,如何动态访问 src/main/resources 中的文件
【发布时间】:2020-06-13 19:01:35
【问题描述】:

我有一个项目使用 src/main/resources*/input* 中的文件并在 src/main/resources*/output* 中生成文件。

我经常用

System.getProperty("user.dir") + "/src/main/resources"

我的问题是它不是动态的。当我使用我的 IDE 时它工作正常,但是当我将我的项目构建为 .jar 文件时,我最终不得不将 src/main/resources 添加到 jar 所在的根目录......这可能很糟糕。

我尝试使用以下返回空指针异常的方法

this.getClass().getResource("input").getPath().toString()

有人可以提供一种动态方式来访问 src/main/resources 中我需要的这些目录以在 IDE 和 .jar 中工作的动态方式

【问题讨论】:

  • 参见Class#getResource(String) 的文档,它解释了使用绝对资源名称和相对资源名称。请记住,资源不是文件,不应像这样访问。

标签: java maven jar


【解决方案1】:

您可以使用以下方式访问资源文件夹中的文件:

this.getClass().getResourceAsStream("/NLP/models/en-lemmatizer.bin").toString();

NLP 是资源中的一个文件夹,其中又包含一个模型文件夹,其中包含 bin 文件。

据我所知,您不能在 jar 中生成文件或创建新文件。

【讨论】:

  • 很明显,任何要创建或删除的文件最好存储在/src/main/resources之外,因为这些资源是要打包的,打包后不会更改
  • @BassBoy 是的,动态应用程序数据应该存储在应用程序外部的某个已知位置。配置文件也是如此,尽管将 default 配置嵌入为资源是完全可以接受的。存储这些文件的一些选项包括用户主目录中的特定于应用程序的目录或特定于平台的位置(例如,Windows 上的%[local]appdata%,不确定其他平台)。基本上,要点是资源应该被视为应用程序的只读资产。
  • @ProGamer 感谢您解决默认配置,它有助于将意图嵌入到包装中的概念联系起来。
猜你喜欢
  • 2016-03-06
  • 2014-11-21
  • 2020-07-24
  • 2017-10-03
  • 2015-05-07
  • 2019-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多