【问题标题】:Where does leading slash ("/") in java class loader getResource leads to?java类加载器getResource中的前导斜杠(“/”)指向哪里?
【发布时间】:2020-05-19 01:23:54
【问题描述】:

我有一个 jar (foo.jar),它的根目录中有一个文件 - 1.txt。

我尝试运行以下命令 -

MyTestClass.class.getClassLoader().getResource("/1.txt");

jar (foo.jar) 是我在类路径中的全部。

我希望这会起作用,因为“/”应该将我引导到类路径/jar 的根目录(根据我在 stackoverflow 中阅读的其他答案)。这将返回 null。

但似乎前面的“/”对我来说没有按预期工作。

我想通了,它没有 / -

MyTestClass.class.getClassLoader().getResource("1.txt") --> jar:file:/tmp/myjar.jar!/1.txt

getResouce 中前导“/”的作用/目的是什么?

【问题讨论】:

  • class.getResource()(使用相对路径)和class.getClassLoader().getResource()(使用绝对路径)是有区别的
  • 你不应该有一个前导斜线。 ClassLoader.getResource() 不希望有一个。但是 Class.getResource() 确实如此,因为没有它,它会在与类相同的包中查找资源。
  • 您使用的是 Java 9 模块吗?它们改变了 Class::getResource 的委托方式。
  • 感谢您的澄清!这确实是我错过的类和类加载器之间的区别!

标签: java


【解决方案1】:

我希望这会起作用,因为“/”应该将我引导到根目录 的类路径/罐子(根据我读过的其他答案 堆栈溢出)。

前导斜杠仅适用于 class.getResource() 以覆盖其默认行为。 class.getClassLoader().getResource() 没有前导斜线概念,因此它总是返回 null。在这种情况下,IMO 它应该抛出异常,但幸运的是,这在 Guava 的 Resources 中得到了解决。

【讨论】:

  • 确实class.getClassLoader().getResource() 在 Java SE 中不应该有前导斜杠,但我发现它可以在 Java EE 中使用前导斜杠。但我不知道为什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-01-13
  • 2020-01-30
  • 1970-01-01
  • 2016-04-21
  • 1970-01-01
  • 2010-09-18
相关资源
最近更新 更多