首页 > 解决方案 > 使用 JAR 中的文件,同时从 jar 中运行应用程序

问题描述

在将应用程序作为 JAR 运行时,我正在尝试使用文件。当我通过 Intelij 运行应用程序时,一切都很好。但是,当我尝试通过 jar 运行它时,我无法访问该文件。我尝试阅读一些包含类似内容的主题,但没有一个有帮助(例如从 jar 中读取资源文件或如何从 Java jar 文件中读取资源文件? )这是我的目标树和资源:在此处输入图像描述 在此处输入图像描述

当我使用

String path = String
        .join("", "classpath:static\assets\config\", fileName);
File file = ResourceUtils.getFile(path); 
InputStream targetStream = new FileInputStream(file)

在 intelij 运行期间,一切正常。

在 jar 的情况下,我尝试过:

String path = String
        .join("", "static\assets\config\", fileName).replace("\\","/")).toExternalForm();
String path2 = String
        .join("", "static\assets\config\", fileName).replace("\\","/")).getFile();
String path3 = String
        .join("", "static\assets\config\", fileName).replace("\\","/")).getPath();

和许多其他。它们导致正确的路径,例如:

 InputStream in = getClass().getResourceAsStream(everyPath);

我收到一个错误: java.io.FileNotFoundException: D:\Projects\myProject\target\project-app-1.0.jar\BOOT-INF\classes\static\assets\config\fileName (The system cannot find the path specified) 当我通过 7zip 打开它时,project-app-1.0.jar 中的路径正好是: D:\Projects\myProject\target\project-app-1.0.jar\BOOT-INF\classes\static\assets\config\fileName

这就是我的资源处理程序的样子:

  private static final String[] CLASSPATH_RESOURCE_LOCATIONS = {
      "classpath:/resources/", "classpath:/static/"};
  @Override
  public void addResourceHandlers(ResourceHandlerRegistry registry) {
    registry.addResourceHandler("/**").addResourceLocations(
        CLASSPATH_RESOURCE_LOCATIONS);
  }

标签: javafileresourcesembedded-resource

解决方案


当您想在 jar 中使用某些东西时,忘记“文件”,它只是一个简单的“资源”,您必须与 getResource 一起使用。

如果您使用标准打包系统,“resources”文件夹中的所有内容都放在 JAR 的根目录下,因此如果您想读取“static\assets\config\”文件夹中的“foo.txt”文件,您必须这样做使用方法:

InputStream in = ClassLoader.getSystemResourceAsStream("static/assets/config/foo.txt");

推荐阅读