загрузка файла изнутри кувшина, разбитого (открытого) jdk12? - PullRequest
0 голосов
/ 10 мая 2019

ошибка или функция? Мой (/ нормальный) метод загрузки файла из 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...