读取依赖 JAR 中的资源会出现 NullPointerException

Reading resources inside dependency JAR gives NullPointerException

我有以下情况:

JAR B 资源树如下所示:

 - resources
     - data
         - file.txt
     - tariffs
         - folder1
             - file.xslx

资源通过以下方式加载:

private InputStream getPath(String nomeFile) {
        ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
        return classLoader.getResourceAsStream(DATA_FOLDER_NAME.concat(File.separator).concat(nomeFile));
}

然后通过BufferedReader管理。

当 运行 mvn test(或应用程序测试)使用 JAR B 项目或在 Unix 环境中使用 JAR A 中的 JAR B 时,一切正常。 当在 Windows 10 环境中使用来自 JAR A 的 JAR B 时,getPath 方法 returns 一个空的 InpuStream 对象因此来自 BufferedReaderNullPointerException :

java.lang.NullPointerException: null
    at java.base/java.io.Reader.<init>(Reader.java:167)
    at java.base/java.io.InputStreamReader.<init>(InputStreamReader.java:72)
    ...

我试图在方法中将 File.separator 更改为硬编码的“/”,似乎一切都在 Windows 上也有效,但在其他地方(管理资源的地方)失败了,因为我假设路径需要手动修复。

我尝试将加载程序更改为:this.getClass().getResourcesAsStream(...) 和其他解决方法,但没有成功。

我的问题是:有没有办法让程序在 Windows 上也按预期工作而不更改上面的代码? 是否缺少任何设置?

谢谢, 阿尔贝托

java -classpath A.jar;B.jar x.y.z.Main

将是您对 运行 的命令在 Windows 上的样子。可能更好地使用这些罐子的绝对路径进行防故障操作

刚刚解决了这个问题。 事实是(现在也是)在 Windows 环境中使用 File.separator 来访问 JAR 中的资源。

这是因为(如 here 所指出的)JAR 文件路径以 UNIX 方式解析。

那么,使用打包在用作依赖项的 JAR 文件中的资源的唯一方法是指定 UNIX 样式的资源路径。

在我的例子中,这意味着用“/”替换 File.separator(以及所有出现的地方)。

此替换引起的其他问题是由于代码中 File.separator 指令的不完整替换。