java - Dockerized Spring Boot 应用程序中的 FileSystemNotFoundException

标签 java spring-boot docker

我正在尝试在 Docker 容器内运行的 Spring Boot 应用程序中加载文件,但出现以下异常:

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

当我在容器外执行 jar 时,不会出现错误。

这是 Dockerfile:

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"
  • 有人知道问题的原因及其可能的解决方案吗?

最佳答案

我认为在容器外部执行 jar 意味着在 IDE 中运行项目。那么database/file.sql实际上可以作为文件使用。

在 jar 中,该文件不可用于 Paths.get() 实际处理。

当尝试访问您应该使用的资源时

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

然后您可以使用java.util.Scanner来收集行:

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

关于java - Dockerized Spring Boot 应用程序中的 FileSystemNotFoundException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54896064/

相关文章:

java - 单元测试Android功能

java - 将响应流从 gRPC 服务返回到 RESTful 客户端时出现问题

php - 在两个不同的容器中运行 Nginx + PHP-FPM 时,该配置是否可以在不共享代码卷的情况下工作?

java - 将多模块 Maven 项目导入 Eclipse (STS 2.5.2) 时遇到问题

java - 计划任务每​​ 3 天在给定时间运行一次

java - 仅在本地计算机 JVM 上设置区域设置

java - 如何在 Spring 属性中扩展通配符?

docker - 我可以使用 CoreOS rkt 运行/转换 Docker-Compose 项目吗?

docker 通过 https 提供内容而没有域(仅具有公共(public) IP 地址)

java: 原始数组——它们被初始化了吗?