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

时间:2018-08-19 04:20:50

标签: java classloader jetty-9 jetty-8

问题:

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

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

其中 my-model.jar 实际上是一个空的文件夹,其中包含model.zip文件。如果解压缩此jar,则会得到 johnsnow / mymodel.zip

我的应用程序代码尝试以以下方式访问此zip:

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

但是,当然,我没有对此资源的正确处理,并且最终得到了nullpointer异常。我究竟做错了什么?我不应该使用getClass().getResourceAsStream()方法访问classpath中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的方法

1 个答案:

答案 0 :(得分:2)

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

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

它将告诉Java开始从根文件夹而不是从当前类包中查找类。