读取依赖 JAR 中的资源会出现 NullPointerException
Reading resources inside dependency JAR gives NullPointerException
我有以下情况:
- JAR A 有 JAR B 作为依赖项
- JAR B 打包了一些资源,当 JAR A 调用 JAR B 的特定方法时加载(在 JAR B 调用的整个生命周期中一次加载)
- 我正在使用 Java SE 11 和 IntelliJ 2021.1.3
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
对象因此来自 BufferedReader
的 NullPointerException
:
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
指令的不完整替换。
我有以下情况:
- JAR A 有 JAR B 作为依赖项
- JAR B 打包了一些资源,当 JAR A 调用 JAR B 的特定方法时加载(在 JAR B 调用的整个生命周期中一次加载)
- 我正在使用 Java SE 11 和 IntelliJ 2021.1.3
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
对象因此来自 BufferedReader
的 NullPointerException
:
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
指令的不完整替换。