在Docker容器中使用Java在类path中访问JSON文件时遇到FileNotFoundException(SprintBootApplication)

当使用Docker容器加载Java jar类path中的JSON文件时,面对FileNotFoundException,它是Spring-Boot应用程序。 此JSON文件在资源文件夹中可用。 能够在docker下的./target/classes/path下看到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 

以下是我尝试和失败的一些方法:

– > 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); 

上述方式都没有运行。 请build议一种方法来解决这个问题。

假设在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。 我不认为这与码头工人有任何关系。 顺便说一句,我想你可以使用Apache Commons IOUtils.toString ,帮助将InputStream转换为字符串。