【问题标题】:Read resource from exactly mine jar从我的 jar 中读取资源
【发布时间】:2022-01-20 12:14:11
【问题描述】:

试图解决非常简单和常见的问题,因为我认为问题是从 jar 中读取文件。问题: 我在根目录中有一个带有 f.txt 的.jar。我想从文件中读取值并使用 class.getClassLoader().getResourceAsStream("f.txt")。 当我在这个单一的罐子上运行测试时,它的工作很完美。 但是当我将我的 jar 添加到另一个项目中,该项目有另一个具有同名文件 f.txt 的 b.jar 时,有时我会从该文件而不是我的文件中读取值。

有什么方法可以从我的 jar 中正确读取我的资源,而不是同名的随机资源?无法提供代码,因为现在不在家。

总结,我有一个带有 a.jarb.jar 的项目,它们的根目录下都有 f.txt。我想始终从 a.jar 读取 f.txt,而无法从 b.jar

读取

【问题讨论】:

  • 使用更独特的文件名(可能包括您的包名作为前缀,例如com.example.myproject.f.txt)。
  • 正是资源应该放在包中的原因。它为它们提供了一个对您的应用程序或库来说是唯一的命名空间,就像您的类一样,从而大大降低了冲突的可能性。这也是MyApplication.class.getResource("f.txt") 默认情况下会在与 MyApplication 相同的包中查找的原因:默认行为是最佳实践。
  • 但 gradle 将所有资源放在根目录下,而不是与类放在同一个包中。其惊人的解决方案,但需要手动工作或一些 gradle 魔法(我无法解决它((()

标签: java jar


【解决方案1】:

也许只是更改f.txt 文件的名称。可能是fa.txtfb.txt

【讨论】:

  • 但是如果另一个库将包含 fa 或 fb 名称?这是非常不安全的解决方案
  • 你能推断出这些文件的用途吗?也许更具描述性的文件名?
  • 从文件中读取值并将其存储在我的类字段中。类似 lib 的版本
  • 也许用更多的描述符来区分文件,比如f-ajar.txt
  • @ChinDaMay 既然有标准的做法,为什么要让它变得复杂呢? (参见问题的 cmets)
猜你喜欢
  • 2021-11-21
相关资源
最近更新 更多