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中使用Mavenpackage
目标将项目构建到*.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/
------------------------------------------------------------------------