ошибка или функция? Мой (/ нормальный) метод загрузки файла из jar-файла не работает в Java12.Способ загрузки файла из банки и внутри нее был
this.getClass().getResourceAsStream("/someFile.txt")
, из этого я создал метод (см. Раздел кода), который работает изнутри банки и распаковал (полезно в разработке).Мой метод работал годами и с тех пор был преобразован в 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")
}
}
Jar работает, как и ожидалось, если он вызывается в JVM Java8, но завершается с ошибкой в JVM Java12 (возвращает ноль) при нормальных обстоятельствах.Я предположил, что, возможно, новая модульная система изменила что-то, связанное с загрузкой ресурсов, но здесь идет кикер: он не дает сбой и в Java12, если jar-файл все еще находится в build \ libs, а я два в землеlevel !!!
Просто чтобы прояснить: мой проект использует gradle, который встраивает свои jar-артефакты в. \ build \ libs, "java -jar build \ libs \ voidchess.jar" работает как положено, но еслия изменяю свой (/ cd в) рабочий каталог на build \ libs, чем «java -jar voidchess.jar», происходит сбой, фактически он завершается неудачно, как только я покидаю уровень проекта, поэтому меняю его для сборки и выполнения «java -jar libs \»voidchess.jar "также терпит неудачу (с jdk12, но не с 8).
Так что мое лучшее текущее объяснение состоит в том, что (Open) JDK12 (и, возможно, ранее) имеет ошибку, которая не обнаружена, потому чтотестирование юнитов выполняется на уровне земли.
Но я открыт для объяснений, которые решают проблему или являются более простым решением, чем оставить файл jar в build \ libs.
я триd много перестановок в коде и как я вызываю банку.Я тестировал oracle jdk8 и openjdk12 ( OpenJDK 64-битная серверная виртуальная машина AdoptOpenJDK (сборка 12 + 33, смешанный режим, совместное использование) ).Я попытался использовать другой объект для вызова getResourceAsStream (а именно, пустой строки "".javaClass.getResourceAsStream(...)
).Я попытался удалить «/» в начале относительного пути и заменить его на «\», потому что я работаю на win10.