and*_*nix 7 java docker spring-boot
我正在尝试在 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!/:?]
Run Code Online (Sandbox Code Playgroud)
当我在容器外执行 jar 时,不会出现该错误。
这是 Dockerfile:
FROM openjdk:8-jdk-alpine
ADD build/app.jar app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","app.jar"]
Run Code Online (Sandbox Code Playgroud)
这是加载文件的方法:
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;
}
Run Code Online (Sandbox Code Playgroud)
该文件位于资源文件夹中:
/src/main/resources/database/file.sql
Run Code Online (Sandbox Code Playgroud)
传递给该方法的参数是:
"database/file.sql"
Run Code Online (Sandbox Code Playgroud)
我认为在容器外部执行 jar 意味着在 IDE 中运行项目。然后database/file.sql实际上可以作为文件使用。
在 jar 中,该文件不可用于 Paths.get() 实际处理。
当尝试访问您应该使用的资源时
InputStream in = getClass().getResourceAsStream(fileName);
Run Code Online (Sandbox Code Playgroud)
然后您可以使用java.util.Scanner来收集行:
String data = new Scanner(in)
.useDelimiter('\n')
.tokens()
.collect(Collectors.joining(StringUtils.SPACE));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4380 次 |
| 最近记录: |