Java class.getResource()虽然在类路径中,但为null

Java class.getResource()虽然在类路径中,但为null,java,jar,null,resources,classpath,Java,Jar,Null,Resources,Classpath,我有一个包含项目主类的jar。这取决于驻留在lib目录中的其他几个JAR。此类依赖jar的一个类加载一个ressource“/Data/foo/bar/file.txt”。但将此文件作为ressource加载会导致null 以下是目录结构: ./main.jar ./lib/lib1.jar ./lib/lib2.jar ./lib/lib3.jar ./lib/runtimedata/Data/foo/bar/file.txt 这是main.jar的manifest.mf的类路径: lib/

我有一个包含项目主类的jar。这取决于驻留在
lib
目录中的其他几个JAR。此类依赖jar的一个类加载一个ressource
“/Data/foo/bar/file.txt”
。但将此文件作为ressource加载会导致null

以下是目录结构:

./main.jar
./lib/lib1.jar
./lib/lib2.jar
./lib/lib3.jar
./lib/runtimedata/Data/foo/bar/file.txt
这是main.jar的manifest.mf的类路径:

lib/lib1.jar lib/lib2.jar lib/lib3.jar lib/runtimedata
我通过

java -jar main.jar
lib2.jar
包含一个试图用

ThatClass.class.getResource("/Data/foo/bar/file.txt");
但这恰好是空的。为什么?lib/runtimedata位于类路径中。 我甚至尝试将
Data
目录放入lib/lib/runtimedata中,以防路径与包含加载类的jar文件相关。但那没用

我做错了什么

编辑

使用运行应用程序

java -cp main.jar:lib/*.jar:lib/runtimedata my.package.Main
工作正常

编辑2


我无法更改执行资源加载的库。我只使用那个库。我唯一可以更改的是main.jar、类路径和命令行。

当用“/”开始路径时,它被认为是绝对的。尝试
ThatClass.class.getResource(“/runtime/Data/foo/bar/file.txt”)


否则,如果您无法更改代码,请将文件放在/Data/foo/bar/file.txt上,我总是使用
X.class.getClassLoader().getResource(“file.txt”)
。也许这会有帮助。尝试
ThatClass.class.getClassLoader().getResource(“/Data/foo/bar/file.txt”)@marioosh不,它没有。我很抱歉。但我无法更改已使用的LIB。我必须按原样使用它们。我只能设置类路径和应用程序的启动方式。我不这么认为。以
“/”
开头的路径是绝对路径。这是正确的。但它应该是类路径的绝对值。对文件系统不是绝对的。由于我已将
“lib/runtimedata”
添加到类路径中,因此应该提供正确的根。例如,我没有将
“/”
放入类路径。因此,将数据目录放入文件系统的根目录或
main.jar的目录应该没有帮助。