使用docker容器中的java访问类路径中的JSON文件时遇到FileNotFoundException(SprintBootApplication)

Anv*_*ddy 7 java linux json docker spring-boot

我在使用docker容器加载Java jar类路径中的JSON文件时遇到FileNotFoundException,它是一个Spring-Boot应用程序.此JSON文件在资源文件夹中可用.我能够在./target/classes/path下的docker中看到JSON文件.

Resource resource = resourceLoader.getResource("classpath:folderNm/file.json");
HashMap<String, String> headerMapping = (HashMap<String, String>) parser.parse(new FileReader(resource.getFile().getAbsolutePath()));
Run Code Online (Sandbox Code Playgroud)

但是我得到了这个例外:

java.io.FileNotFoundException: class path resource [folderNm/file.json] cannot be resolved to absolute file path because it does not reside in the file system: jar:file:/app.jar!/folderNm/file.json
Run Code Online (Sandbox Code Playgroud)

我试过了

- > resource.getFile().getPath(); - > resource.getFile().getCanonicalPath(); - >" ./target/classes/folderName/fileName"(硬编码的FilePath位置) - >" /app.jar!/folderNm/file.json"(硬编码的FilePath位置)

InputStream inputStream = getClass().getResourceAsStream("xyz.json");
BufferedReader br = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));
            StringBuilder responseStrBuilder = new StringBuilder();
            String inputStr;
            while ((inputStr = br.readLine()) != null)
                responseStrBuilder.append(inputStr);
Run Code Online (Sandbox Code Playgroud)

以上都没有运行.请建议一种解决此问题的方法.

mac*_*ias 4

假设在maven结构中(你正在使用maven,对吧?)你的文件位于src/main/resources/folderName/file.json,你传递到的路径getResourceAsStream应该是/folderName/file.json

实际上一切都在javadocs中进行了解释:

在委派之前,使用以下算法根据给定资源名称构造绝对资源名称:

  • 如果名称以“/”(“\u002f”) 开头,则资源的绝对名称是“/”后面的名称部分。
  • 否则,绝对名称的形式如下:modified_pa​​ckage_name/name

其中,modified_pa​​ckage_name 是该对象的包名称,其中“/”替换为“.” ('\u002e')。

基本上,如果您跳过前面的“/”,它会在您的类的包内查找folderName 以下代码对我来说效果很好:

    InputStream inputStream = StackTest.class.getResourceAsStream("/folderName/file.json");
    BufferedReader br = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));
    StringBuilder responseStrBuilder = new StringBuilder();
    String inputStr;
    while ((inputStr = br.readLine()) != null)
        responseStrBuilder.append(inputStr);
    System.out.println(responseStrBuilder.toString());
Run Code Online (Sandbox Code Playgroud)

假设我的file.json位于 src/main/resources/folderName 中。我不认为这与docker有任何关系。顺便说一句,我认为您可以利用Apache Commons IOUtils.toString来帮助将 InputStream 转换为字符串。