Java:无法将JPG图像作为资源加载到JAR文件中

问题描述 投票:0回答:4

对于以下代码段:

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

八位getResourceopenStream返回null。我该如何缓解这个问题?

java jar nullpointerexception null embedded-resource
4个回答
0
投票

您需要将'logo.jpg'放入相对于CLASSPATH根目录的'pics'目录中,否则,ClassLoader.getResource()将返回null,当您尝试基于它打开InputStream时会导致NPE 。

因此,使用带有此代码的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)

如果未找到相对于CLASSPATH根目录的“ pics / logo.jpg”。在正确的位置(在本例中为Eclipse项目的“ src / pics”文件夹,将其自动放入“ bin / pics”文件夹)中创建“ logo.jpg”文件,输出为...

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

通常,资源将捆绑在您的jar中,因此“ logo.jpg”应该位于jar根目录的“ / pics”目录中。


0
投票

您可能没有足够的权限,这取决于您的应用程序是否与SecurityManager一起运行以及它的安全策略。

如果我正确地阅读了Manual

它还为您提供不同方法之间细微差别的指导和解释。


0
投票

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的位置。该can是文件系统上的位置(如果资源不在JAR文件中……),但它也可以是对数据库记录的引用,以URI的形式提供,具体取决于类的实现涉及装载机。


0
投票

要从*.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. 在IDE中使用Maven *.jar目标将项目构建到package文件中>

    ““>]

© www.soinside.com 2019 - 2024. All rights reserved.