无法从META-INF读取文件

17

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

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

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

我不明白背后的理论是什么?ClassLoader 如何在文件系统中执行查找?我该如何得到这个文件呢?


3
这是一个网络应用程序吗? - Bozho
2个回答

31

尝试去掉第一个斜杠:

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

如果你在一个Class对象上调用getResourceAsStream方法,那么你需要一个前导斜杠。在一个ClassLoader对象上,路径总是绝对的,不需要前导斜杠。


如果它是位于类路径根目录上的普通 META-INF,则需要前导斜杠。 - Bozho
2
@Bozho 如果您在 Class 对象上调用 getResourceAsStream 方法,而不是在类加载器上调用,则需要一个前导斜杠。 - dogbane
调用类加载器时不需要它,但肯定不会有影响。class.getResourceAsStream()的作用是将路径相对于自身解析,然后将其传递给其类加载器的getResourceAsStream方法。 - Bozho
1
如果你向 class.getResourceAsStream 方法传递了一个绝对路径,它将在传递给其类加载器之前去掉前导斜杠。在我看来,类加载器根本无法处理前导斜杠。 - dogbane
但是,我遇到了问题,因为我有类似于“META-INF\resources/subdir/foo.bar”的东西,上面的代码失败了(因为反斜杠?)。在我将所有反斜杠改为正斜杠后,它就可以工作了("META-INF/resources/subdir/foo.bar")。 - inor

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接