FileSystemNotFoundException в Dockerized Spring Boot Application - PullRequest
0 голосов
/ 27 февраля 2019

Я пытаюсь загрузить файл в приложении весенней загрузки, которое выполняется внутри контейнера Docker, но я получаю следующее исключение:

java.nio.file.FileSystemNotFoundException 
 at com.sun.nio.zipfs.ZipFileSystemProvider.getFileSystem(ZipFileSystemProvider.java:171) ~[zipfs.jar:1.8.0_191] 
   at com.sun.nio.zipfs.ZipFileSystemProvider.getPath(ZipFileSystemProvider.java:157) ~[zipfs.jar:1.8.0_191] 
 at java.nio.file.Paths.get(Paths.java:143) ~[?:1.8.0_191] 
 at app.metrics.collector.util.FileUtils.getContentAsSingleLine(FileUtils.java:17) ~[classes!/:?] 
     at app.metrics.collector.jobs.DbQueryJob.generatePreparedStatement(DbQueryJob.java:54) ~[classes!/:?] 
at app.metrics.collector.jobs.DbQueryJob.execute(DbQueryJob.java:36) ~[classes!/:?] 
  at org.quartz.core.JobRunShell.run(JobRunShell.java:202) [quartz-2.3.0.jar!/:?] 

Ошибка не появляется, когда я выполняюбанка за пределами контейнера.

Вот файл Docker:

FROM openjdk:8-jdk-alpine
ADD build/app.jar app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","app.jar"]

А вот метод, который загружает файл:

    public static String getContentAsSingleLine(String fileName) throws URISyntaxException, IOException {
    String data;
    Path path = Paths.get(FileUtils.class.getClassLoader().getResource(fileName).toURI());
    Stream<String> lines = Files.lines(path);
    data = lines.collect(Collectors.joining(StringUtils.SPACE));
    lines.close();
    return data;
}

Файл находится впапка ресурса:

/src/main/resources/database/file.sql

и аргумент, передаваемый методу:

"database/file.sql"
  • Кто-нибудь имеет представление о причине проблемы и ее возможном решении?

Ответы [ 2 ]

0 голосов
/ 27 февраля 2019

Я думаю, что выполняя jar вне контейнера, вы подразумеваете запуск проекта в вашей IDE.Тогда database/file.sql фактически доступен в виде файла.

В банке файл недоступен для Paths.get () для фактической обработки.

При попытке доступа к ресурсу вы должныиспользуйте

InputStream in = getClass().getResourceAsStream(fileName);

, затем вы можете использовать java.util.Scanner для сбора строк:

String data = new Scanner(in)
 .useDelimiter('\n')
 .tokens()
 .collect(Collectors.joining(StringUtils.SPACE));
0 голосов
/ 27 февраля 2019

Похоже, что исключение относится к zip / архивному файлу, пожалуйста, убедитесь, что это происходит при загрузке sql или любого другого файла?

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