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

Java:无法将JPG映像作为JAR文件中的资源加载,java,jar,nullpointerexception,null,embedded-resource,Java,Jar,Nullpointerexception,Null,Embedded Resource,在以下代码段中: InputStream inputStream = ClassLoader.getSystemClassLoader() .getResource("pics/logo.jpg") .openStream(); getResource或openStream返回null。如何缓解此问题?您需要将'logo.jpg'放在'pics'目录中,相对于类路径的根目录,否

在以下代码段中:

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

getResource
openStream
返回
null
。如何缓解此问题?

您需要将'logo.jpg'放在'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)
如果相对于类路径根未找到“pics/logo.jpg”。在正确的位置创建“logo.jpg”文件(在本例中是Eclipse项目的“src/pics”文件夹,它将自动将其放入“bin/pics”文件夹),输出为

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

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

根据应用程序是否使用SecurityManager及其安全策略运行,您可能没有足够的权限

如果我读对了罚款


它还为您所使用的不同方法之间的细微差异提供了指导和解释。

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


两者都不是真正的“路径”(在文件系统上的位置意义上),它们确定相对于类路径的位置。这可以是文件系统上的一个位置(如果资源不在JAR文件中…),但也可以是对作为URI提供的数据库记录的引用,具体取决于所涉及的类加载器的实现。

要从
*.jpg
文件加载
*.JAR
图像(或任何其他图像),请使用以下模式:

  • 创建一个项目,然后将其编译为
    *.jar
    文件

    project-with-resources
    │
    ├── src
    │   └── main
    │       ├── java
    │       │   ├── . . .
    │       │   └── Project.java
    │       └── resources
    │           ├── . . .
    │           └── image1.jpg
    └── pom.xml
    
  • 配置
    maven资源插件
    (可能有多个资源文件夹)

  • 如有必要,准备吸气剂

    public class Project {
        private BufferedImage image;
        . . .
        public BufferedImage getImage() {
            return image;
        }
    }
    
  • 在IDE中使用Maven
    package
    目标将项目构建到
    *.jar
    文件中


  • 我在Netbeans中创建了一个Java with Ant应用程序:

    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)

    奇怪的;我没有追根究底。然后,我用同样的代码在Netbeans中创建了一个Java with Maven应用程序,当我在Netbeans内外运行它时,我得到了正确的答案。从Netbeans内部:

    ------------------------------------------------------------------------
    Building JavaApplication46 1.0-SNAPSHOT
    ------------------------------------------------------------------------
    
    --- exec-maven-plugin:1.5.0:exec (default-cli) @ JavaApplication46 ---
    /Users/enta/NetBeansProjects/JavaFrontEnd/JavaApplication46/target/classes/
    ------------------------------------------------------------------------
    
    从命令行:


    了解路径的位置有助于将资源放在正确的位置。

    不必像这样使用类加载器。只需使用
    GetResource.class.GetResource()
    。类加载器版本有几种方法会失败,而仅仅使用ClassName.class是不会的。
    public class Main {
        public static void main(String[] args){
            System.out.println(ClassLoader.getSystemClassLoader().
                    getResource(".").getPath());
        }
    }
    
    ------------------------------------------------------------------------
    Building JavaApplication46 1.0-SNAPSHOT
    ------------------------------------------------------------------------
    
    --- exec-maven-plugin:1.5.0:exec (default-cli) @ JavaApplication46 ---
    /Users/enta/NetBeansProjects/JavaFrontEnd/JavaApplication46/target/classes/
    ------------------------------------------------------------------------