错误或功能?我的(/普通)从jar内加载文件的方法在Java12中似乎失败。 从罐子中和罐子中加载文件的方法是
this.getClass().getResourceAsStream("/someFile.txt")
,由此我创建了一个方法(请参见代码部分),该方法可在jar中工作并解压(在开发中有用)。我的方法已经使用了多年,并且已经转换为Kotlin。
fun getResourceStream(relativePath: String): InputStream {
val file = File("src/main/resources/$relativePath")
return if (file.exists()) {
//should find file in file system
FileInputStream(file)
} else {
//should find file in jar
file.javaClass.getResourceAsStream("/$relativePath")
}
}
如果在Java8 JVM中调用,则jar会按预期工作,但在正常情况下在Java12 JVM中会失败(返回null)。 我以为新模块系统可能改变了一些与资源加载有关的内容,但问题来了:只要jar文件仍在build \ libs中并且我只有两个人,它就不会在Java12中失败水平!
请明确说明:我的项目使用gradle在。\ build \ libs中构建其jar工件,“ java -jar build \ libs \ voidchess.jar”按预期工作,但如果我将(/ cd更改为)比“ java -jar voidchess.jar”构建目录要失败,实际上,一旦我离开项目的基础层,它就会失败,因此将其更改为构建并执行“ java -jar libs \ voidchess.jar”也将失败(使用jdk12,而不是8)。
所以,我目前最好的解释是(Open)JDK12(可能更早)有一个bug,由于该单元的测试是在地面上执行的,因此未发现。
但是,我愿意接受解决此问题的解释,或者比将jar文件保留在build \ libs中更容易的解决方法。
我尝试了许多代码置换以及如何调用jar。我测试了oracle jdk8和openjdk12( OpenJDK 64位服务器VM AdoptOpenJDK(内部版本12 + 33,混合模式,共享))。我尝试使用其他对象来调用getResourceAsStream(即空字符串"".javaClass.getResourceAsStream(...)
)。我尝试在相对路径的开头删除“ /”,并用“ \”代替,因为我在win10上工作。