【问题标题】:Unable to read file from spring boot .jar无法从 spring boot .jar 读取文件
【发布时间】:2021-03-05 16:09:00
【问题描述】:

我想访问生产服务器上 jar 中名为 reports/invoiceSweetChoice.jasper 的类路径上的文件。无论我做什么,我都会得到空值。

我试过this.getClass().getResourceAsStream("reports/invoiceSweetChoice.jasper"),试过InputStream等。我打印出System.getProperty("java.class.path")的内容,它是空的。不知道这怎么可能。您对如何解决这个问题有什么建议吗?

【问题讨论】:

  • jar 似乎有所不同。这有帮助吗(第 5 节)? mkyong.com/java/java-read-a-file-from-resources-folder
  • 在你的 jar 的 manifest.mf 中,你的类路径是什么?
  • 看看springResourceLoader接口。你可以自动接线。您可能希望将文件放在 src/main/resources 目录中。
  • @HopeyOne 文件位于 src/main/resources/reports/ 文件夹中。您能否解释一下您对 ResourceLoader 类的看法?
  • @hd1 清单没有该信息。如何定义?

标签: java spring-boot path resources


【解决方案1】:
@Autowired private ResourceLoader resLoad;


void someMethod() {
    Resource r = resLoad.getResource("classpath:reports/file.abc");
    r.getInputStream()...
    ...

【讨论】:

  • 我得到了 java.lang.NullPointerException。我已经检查过了,我的文件在那个文件夹中
  • jar中是否存在该文件的reports目录?应该在 BOOT-INF/classes/
  • 是的,它就在那里。如果重要的话,这是一个网络应用程序。我正在使用 java -jar jarFile.jar 运行它。我错过了一些奇怪的服务器配置吗?
  • 我找不到任何特定的配置来让它在我们的 spring boot jar 中工作。我们的清单中没有类路径。
  • 你运行的是什么版本的spring-boot?
【解决方案2】:

在 manifest.mf 中,类路径使用class-path key and a space-delimited list of files 定义,如下:

jarfile 根目录下的 MANIFEST.MF。

Class-Path: hd1.jar path/to/label007.jar path/to/foo.jar

如果 jar 文件名中有空格,则应将它们括在引号中。

如果它是一个 web 应用程序,报告路径应该在你的类路径的 BOOT-INF 子目录中——如果你把它放在标准布局中的 src/main/resources 中,这将由 maven 自动执行。

编辑:

既然您已经阐明了您想要做什么,那么您有 2 种方法。就像我上面说的,你可以从你的 webapp 的 BOOT-INF 子目录中获取文件,或者你可以枚举 jar 中的条目,直到找到你想要的:

JarInputStream is = new JarInputStream(new FileInputStream("your/jar/file.jar"));
JarEntry obj = null
while ((obj = is.getNextJarEntry()) != null) {
   JarEntry entry = (JarEntry)obj;
   if (entry.getName().equals("file.abc")) {
        ByteArrayOutputStream baos = new ByetArrayOutputStream(); 
        IOUtils.copy(jarFile.getInputStream(entry), baos);
        String contents = new String(baos.toByteArray(), "utf-8");
        // your entry is now read into contents
   }
}

【讨论】:

  • 这是从其他 jar 读取时?但是这个文件在我正在运行的 jar 中。如果 jar 名为 test.jar 我是否需要添加 Class-Path : test.jar 即使 MANIFEST.MF 和我要读取的文件在那个 jar 中?
  • 仅当它们位于外部 jar 中时。如果该类包含在 jar 中,则不需要。如果它在嵌入式 jar 中,则需要自定义类加载器。
  • 文件在 jar 中。嗯...我需要一个自定义类加载器?怎么做?为什么我需要它,为什么它不能以正常方式加载?
  • 哪个罐子?您正在运行的那个还是嵌入在 jar 中的?
  • 文件在我正在运行的 jar 中。
猜你喜欢
  • 2017-10-07
  • 2019-05-31
  • 1970-01-01
  • 2020-07-08
  • 2017-06-18
  • 2019-02-19
  • 1970-01-01
  • 2020-02-14
  • 2023-01-10
相关资源
最近更新 更多