Извлечение изображения из ресурсов программы java, упакованной в файл JAR - PullRequest
0 голосов
/ 18 февраля 2020

У меня есть программа java, которая считывает ресурсы изображений с диска.

Это хорошо работает при тестировании с mvn exec:java.

Однако, когда программа упакована с mvn packaged, выдает следующую ошибку:

java .nio.file.FileSystemNotFoundException


Структура проекта

├── java
│   └── com
│       ├── aaa
│       │   ├── bbb
│       │   │   ├── AssemblingTags.java
│       │   │   ├── BatchLifeCycle.java
│       │   │   ├── config
│       │   │   │   ├── AssemblingTagsConfig.java
│       │   │   │   ├── Configuration.java
│       │   │   │   ├── DatabaseConfig.java
│       │   │   │   ├── ExecutionContext.java
│       │   │   │   ├── InjectionTagsConfig.java
│       │   │   │   ├── QualityConfig.java
│       │   │   │   └── TraceabilityContext.java
│       │   │   ├── Database.java
│       │   │   ├── DeviceLifeCycle.java
│       │   │   ├── Devices.java
│       │   │   ├── InjectionTags.java
│       │   │   ├── QRCode.java
│       │   │   ├── Quality.java
│       │   │   ├── Simulator.java
│       │   │   ├── ThreadManager.java
│       │   │   ├── TimeManager.java
│       │   │   └── Utils.java
│       │   └── traceability
│       │       └── Tracer.java
│       └── example
│           ├── AdminAPI.java
│           ├── ConfigAPI.java
│           ├── CORSFilter.java
│           ├── DeviceAPI.java
│           ├── Main.java
│           ├── QrCodeAPI.java
│           ├── ToggleAPI.java
│           └── TracerAPI.java
└── resources
    └── images
        └── strioscopy
            ├── v1-2.png
            ├── v1-3.png
            ├── v2-1.png
            └── v2-2.png

Кусок кода, который читает изображение

Обратите внимание на отпечатки.

try {
            System.out.println("images/" + type + "/" + name); <-- PRINT 1
            URL res = getClass().getClassLoader().getResource("images/" + type + "/" + name);
            System.out.println(res);                           <-- PRINT 2
            File file = Paths.get(res.toURI()).toFile();
            FileInputStream fis = new FileInputStream(file);
            byte[] data = new byte[(int) file.length()];
            fis.read(data);
            fis.close();
            return Response.ok(data).build();
        } catch (Exception e) {
            e.printStackTrace();
            return Response.serverError().entity(e).build();
        }

При использовании mvn exec:java работает и выведите:

images/strioscopy/v1-3.png 
file:/home/hduser/program/target/classes/images/strioscopy/v1-3.png

При выполнении с помощью jar (java -jar myprogram-jar-with-dependencies.jar) происходит сбой и выводится:

images/strioscopy/v1-3.png

jar:file:/home/hduser/program/target/myprogram-jar-with-dependencies.jar!/images/strioscopy/v1-3.png

Насколько я понимаю, он не может прочитать изображения из банки (как это «Джаред»). Но как решить эту проблему?

Более того, обратите внимание на восклицательный знак: (между шевронами) jar:file:/home/hduser/program/target/myprogram-jar-with-dependencies.jar>>!<</images/strioscopy/v1-3.png

Это нормально?

1 Ответ

1 голос
/ 18 февраля 2020

По какой-то причине он дает ожидаемый результат со следующим кодом:

try {
            System.out.println("images/" + type + "/" + name);
            InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream("images/" + type + "/" + name);
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            int nRead;
            byte[] data = new byte[1024];
            while ((nRead = is.read(data,0,data.length)) != -1) {
                baos.write(data, 0, nRead);
            }
            baos.flush();
            byte[] ba = baos.toByteArray();
            return Response.ok(ba).build();
        } catch (Exception e) {
            e.printStackTrace();
            return Response.serverError().entity(e).build();
        }

Однако я не могу объяснить, почему. (Если кто-то может пролить свет на это, добро пожаловать!)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...