【问题标题】:cannot read a file from META-INF无法从 META-INF 读取文件
【发布时间】:2011-01-24 12:43:03
【问题描述】:

我在做一些非常愚蠢的事情时遇到了一个大问题。也就是说,打开一个流到我的 META-INF 文件夹中的资源文件。我正在开发一个 jar 工具并这样做:

InputStream schemaIS = this.getClass().getClassLoader().getResourceAsStream("/META-INF/schema.xsd");

我只是得到一个空值!该项目是使用 maven 构建的,xsd 文件最终位于 META-INF 文件夹中,但它仍然无法正常工作。

我不明白它背后的理论是什么? ClassLoader 如何在文件系统中执行查找?我如何获得文件?

【问题讨论】:

  • 它是一个网络应用程序吗?

标签: java


【解决方案1】:

尝试删除第一个斜线:

InputStream schemaIS = this.getClass().getClassLoader().getResourceAsStream("META-INF/schema.xsd");

如果您在 Class 对象上调用 getResourceAsStream 方法,则需要一个前导斜杠。在ClassLoader 对象上,路径始终是绝对路径,不需要前导斜杠。

【讨论】:

  • 如果它是位于类路径根目录的常规 META-INF,则需要前导斜杠。
  • @Bozho 如果您在 Class 对象上调用 getResourceAsStream 方法,则需要前导斜杠,而不是在类加载器上。
  • 如果调用类加载器,它不需要,但肯定不会有什么不同。 class.gerResourceAsStream() 所做的是解析相对于自身的路径,然后将其传递给其类加载器的 getResourceAsStream。
  • @Bozho 如果您将绝对路径传递给class.getResourceAsStream,它将在 将其传递给其类加载器之前去除前导斜杠。类加载器根本不适用于前导斜杠,IMO。
  • 没有前导斜杠...但是,我遇到了问题,因为我有类似“META-INF\resources/subdir/foo.bar”的东西,上面失败了(因为反斜杠?)。在我将所有斜杠更改为正斜杠之后,它起作用了(“META-INF/resources/subdir/foo.bar”)
【解决方案2】:

试试这个路径:META-INF/schema.xsd(第一个 / 省略)

【讨论】:

    猜你喜欢
    • 2012-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-28
    • 1970-01-01
    • 2018-07-23
    • 2013-02-28
    相关资源
    最近更新 更多