Использование файла из JAR, а запуск приложения из JAR - PullRequest
0 голосов
/ 03 апреля 2020

Я пытаюсь использовать файл при запуске приложения в качестве JAR. Когда я запускаю приложение через Intelij, все нормально. Однако, когда я пытаюсь запустить его через jar, я не могу получить доступ к файлу. Я пытался прочитать несколько тем, содержащих похожие материалы, но ни одна из них не помогла (например, Чтение файла ресурса из jar или Как мне прочитать файл ресурса из Java файла jar? ) Вот мое целевое дерево и ресурсы: enter image description here enter image description here

Когда я использую

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

Во время интелий беги, все работает.

В случае с банкой я попробовал:

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

и многие другие. Они приводят к правильному пути, например:

  • file: / D: / Projects / myProject / target / classes / static / assets / config / fileName (в случае toExternalForm)
  • / D: / Projects / myProject / target / classes / static / assets / config / fileName (в случае getFile)

    Однако все они приводят к нулевому InputStream, когда я пытаюсь:

 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) Когда путь в project-app-1.0.jar, когда я открываю его с помощью 7zip, равен: 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);
  }

1 Ответ

0 голосов
/ 06 апреля 2020

забудьте о "файлах", когда вы хотите использовать что-то внутри вашего jar, это просто "Ресурс", который вы должны использовать с getResource.

Если вы используете стандартную систему упаковки, все внутри " папка resources "помещается в root вашего JAR-файла, поэтому, если вы хотите прочитать файл" foo.txt "внутри папки" static \ assets \ config \ ", вам нужно использовать метод:

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