从(打开)jdk12的jar中加载文件?

时间:2019-05-10 19:20:32

标签: kotlin jar

错误或功能?我的(/普通)从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上工作。

0 个答案:

没有答案