如何使用类加载器在 model.zip 文件中获取输入流,其中 zip 文件包装在类路径中的 .jar 文件中

How do I use a classloader to get inputstream on a model.zip file where the zip file is wrapped in a .jar file in classpath

问题:

我们有一个码头网络应用程序,在应用程序代码中,我试图访问类路径中 jar 中的 zip。这是 libs 文件夹中的 jar:

/path/to/app/x.x.0-SNAPSHOT/apps/libs/my-model.jar

其中 my-model.jar 实际上只是一个包含 model.zip 文件的空文件夹。如果我提取这个罐子,我会得到 johnsnow/mymodel.zip

我的应用程序代码尝试访问此 zip 作为:

getClass().getResourceAsStream("johnsnow/mymodel.zip")

但是当然,我没有得到这个资源的正确句柄,最终得到一个空指针异常。我究竟做错了什么?我不应该使用 getClass().getResourceAsStream() 方法访问类路径中 jar 文件中的文件吗?

脚注:

因为 model.zip 太大,我们决定不将其与代码库一起发布。因此,我们将其推送到一个 nexus 存储库中,并通过 gradle 编译依赖项引用 jar,如下所示:

compile "com.company.group.nlp:my-model:1.0@jar"

构建发行版会提取这个 jar,并将其放入 apps/libs 中这一事实告诉我 gradle 完成了它的工作(将依赖项下载到类路径)。问题仍然是我似乎无法找到在 my-model.jar

中访问 mymodel.zip 的方法

尝试在文件路径中添加斜杠:

getClass().getResourceAsStream("/johnsnow/mymodel.zip");

它会告诉 java 从根文件夹开始寻找 class,而不是从当前的 class 包。