FileSystemNotFoundException en una aplicación Dockerized Spring Boot

Estoy tratando de cargar un archivo en una aplicación de inicio de Spring que se ejecuta dentro de un contenedor Docker pero obtengo la siguiente excepción:

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!/:?] 

El error no aparece cuando ejecuto el jar fuera del contenedor.

Aquí está el Dockerfile:

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

Y aquí está el método que carga el archivo:

    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;
}

El archivo se encuentra en la carpeta de recursos:

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

y el argumento pasado al método es:

"database/file.sql"
  • ¿Alguien tiene una idea de la causa del problema y su posible solución?
Respuesta 1

Creo que al ejecutar el jar fuera del contenedor te refieres a ejecutar el proyecto en tu IDE. Entonces database/file.sqlestá realmente disponible como un archivo.

En el archivo jar, el archivo no está disponible para que Paths.get () realmente lo maneje.

Cuando intente acceder al recurso que debe usar

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

A continuación, puede utilizar java.util.Scannerpara recoger las líneas:

String data = new Scanner(in)
 .useDelimiter('\n')
 .tokens()
 .collect(Collectors.joining(StringUtils.SPACE));
Respuesta: 2

Puedo recuperar una lista de archivos de un directorio usando el siguiente código public List listClassFilesForFolder (carpeta de archivo final) {for (final File fileEntry: folder.listFiles ()) {...

Después de leer este artículo. Tengo algunas preguntas sobre la autenticación NTLM. Cuando aplico NTLM en un sitio web asp.net ¿El proceso de desafío / respuesta ocurrió entre el navegador web y IIS? Dónde ...

Bastante nuevo en Java, pero tratando de encontrar la manera de resolver un problema que encontré. Leí muchos artículos sobre el formato de fecha / hora desconocidas en Java, ya que sé que primero debes conocer el patrón de ...

Quiero tratar los valores en minúsculas y mayúsculas de la misma manera, y asegurarme de que dos colecciones sean iguales (no es necesario ordenarlas) Esta es mi implementación: booleano privado ...