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

时间:2016-10-06 11:28:17

标签: java json linux 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()));

但我得到了这个例外:

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

我试过

- &GT; resource.getFile().getPath(); - &GT; resource.getFile().getCanonicalPath(); - &GT; “./target/classes/folderName/fileName”(硬编码的FilePath位置) - &GT; “/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);

上述方式都没有运行。请建议一种解决此问题的方法。

2 个答案:

答案 0 :(得分:2)

假设在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());

假设我在src / main / resources / folderName中有 file.json 。我不认为它与docker有任何关系。 顺便说一下,我认为你可以使用Apache Commons IOUtils.toString帮助将InputStream转换为String。

答案 1 :(得分:0)

创建文件:

src/main/resources/firebase/your_account_json.json

加载InputStream:

String path = "/firebase/your_account_json.json";
InputStream in = this.getClass().getResourceAsStream(path);
FirebaseOptions options = new FirebaseOptions.Builder().setCredentials(GoogleCredentials.fromStream(in))
      .setDatabaseUrl("https://your-project.firebaseio.com")
      .setStorageBucket("your-project.appspot.com")
      .build();