Java: невозможно загрузить изображение JPG в качестве ресурса в файле JAR. - PullRequest
2 голосов
/ 07 мая 2020

В следующем фрагменте кода:

InputStream inputStream = 
            ClassLoader.getSystemClassLoader()
                       .getResource("pics/logo.jpg")
                       .openStream();

либо getResource, либо openStream возвращает null. Как я могу решить эту проблему?

Ответы [ 5 ]

1 голос
/ 19 мая 2020

Чтобы загрузить изображение *.jpg (или любое другое) из файла *.jar, используйте эту схему:

  1. Создайте проект, который затем будет скомпилирован в файл *.jar

    project-with-resources
    │
    ├── src
    │   └── main
    │       ├── java
    │       │   ├── . . .
    │       │   └── Project.java
    │       └── resources
    │           ├── . . .
    │           └── image1.jpg
    └── pom.xml
    
  2. Настроить maven-resources-plugin (может быть несколько папок ресурсов)

    <build>
        <defaultGoal>package</defaultGoal>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <targetPath>resources</targetPath>
            </resource>
            . . .
        </resources>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-resources-plugin</artifactId>
                <version>3.1.0</version>
            </plugin>
            . . .
        </plugins>
    </build>
    
  3. В Java используйте код ImageIO класс для чтения изображений в BufferedImage объекты

    public class Project {
        public static void main(String[] args) throws IOException {
            BufferedImage image =
                ImageIO.read(Project.class
                    .getResourceAsStream("/resources/image1.jpg"));
        }
    }
    
  4. При необходимости подготовьте геттеры

    public class Project {
        private BufferedImage image;
        . . .
        public BufferedImage getImage() {
            return image;
        }
    }
    
  5. Соберите проект в *.jar файл с использованием Maven package цель в вашей среде IDE

    Maven Lifecycle

0 голосов
/ 19 мая 2020

Я создал приложение Java с Ant в Netbeans следующим образом:

public class Main {
    public static void main(String[] args){
        System.out.println(ClassLoader.getSystemClassLoader().
                getResource(".").getPath());
    }
}

Когда я запустил его из Netbeans, я получил:

/ Users / enta / NetBeansProjects / JavaFrontEnd / JavaApplication47 / build / classes /

Но если я запустил его из командной строки с помощью

java -jar "/ Users / enta / NetBeansProjects /JavaFrontEnd/JavaApplication50/dist/JavaApplication50.jar"

Я получил

Исключение в потоке "main" java .lang.NullPointerException в Main.main (Main . java: 13)

Странно; Я не дошел до сути. Затем я создал Java с приложением Maven, также в Netbeans, с тем же самым кодом, и когда я запускаю его как внутри, так и вне Netbeans, я получаю правильный ответ. Изнутри Netbeans:

------------------------------------------------------------------------
Building JavaApplication46 1.0-SNAPSHOT
------------------------------------------------------------------------

--- exec-maven-plugin:1.5.0:exec (default-cli) @ JavaApplication46 ---
/Users/enta/NetBeansProjects/JavaFrontEnd/JavaApplication46/target/classes/
------------------------------------------------------------------------

Из командной строки: enter image description here

Знание того, где вы находитесь с точки зрения пути, должно помочь вам разместить ресурс в правильное место.

0 голосов
/ 16 мая 2020

У вас может не быть достаточных разрешений в зависимости от того, работает ли ваше приложение с SecurityManager и его политикой безопасности.

Если я правильно прочитал The Fine Manual

It также предлагает руководство и объяснение тонких различий между различными методами, имеющимися в вашем распоряжении.

0 голосов
/ 18 мая 2020

Существует разница в интерпретации имени ресурса между java.lang.Class.getResource() и java.lang.ClassLoader.getResource(): для первого, данное имя относится к пакету класса, если оно не начинается с '/', имени, присвоенного второй всегда «абсолютный».

Это означает, что когда вы вызываете java.lang.String.class.getResource( "resource/Doc.jpg" ), он будет искать /java/lang/resource/Doc.jpg, в то время как при вызове java.lang.String.class.getClassLoader().getResource( "resource/Doc.jpg" ) пытается найти /resource/Doc.jpg.

Оба они на самом деле не являются «путями» (в смысле расположения в файловой системе), они определяют расположение относительно CLASSPATH. Это может быть местоположением в файловой системе (в случае, если ресурс не находится внутри файла JAR…), но это также может быть ссылка на запись базы данных, предоставленная как URI, в зависимости от реализации задействованные загрузчики классов.

0 голосов
/ 14 мая 2020

Вам нужно поместить 'lo go .jpg' в каталог 'pics' относительно root вашего CLASSPATH, иначе ClassLoader.getResource () вернет null, что приведет к NPE при попытке откройте InputStream на его основе.

Итак, используя рабочую область eclipse с этим кодом ...

import java.io.InputStream;
import java.net.URL;

public class GetResource {
    public static void main(String[] args) throws Exception {
        ClassLoader classLoader = ClassLoader.getSystemClassLoader();
        URL resource = classLoader.getResource("pics/logo.jpg");
        System.out.println("resource is " + resource);
        InputStream inputStream = resource.openStream();
        System.out.println("The inputStream was not null");
    }
}

Он вернет ...

resource is null
Exception in thread "main" java.lang.NullPointerException
    at GetResource.main(GetResource.java:9)

если "pics / lo go .jpg" не найден относительно CLASSPATH root. Создайте файл «lo ​​go .jpg» в нужном месте (в данном случае в папке «src / pics» проекта Eclipse, который автоматически поместит его в папку «bin / pics»), и на выходе будет ...

resource is file:/home/joe/workspace/Play/bin/pics/logo.jpg
The inputStream was not null

Обычно ресурсы объединяются внутри вашего jar-файла, поэтому файл «lo ​​go .jpg» должен находиться в каталоге «/ pics» в root jar-файла.

...