我制作了一个简单的小程序,它加载了一个包含在我制作的.jar文件中的图像。该项目有一个名为“kap12”的包和一个名为“U1”的类。我有一个名为“resrc”的文件夹,其中包含我的图像。此文件夹位于根目录(与kap12相同的文件夹)。
这是目录结构:
test.jar
*kap12
-U1.class
*resrc
-django.jpg
test.html //outside the .jar, same folder as where test.jar is located
当我在Eclipse中使用Appletviewer(没有.jar)运行它时,这个程序运行正常。它定位图像并显示它。但是当我用.jar在html中运行它时,程序找不到它。我每次都得到nullpointer异常。这是我的.html:
<HTML>
<HEAD>
</HEAD>
<TITLE> U1 </TITLE>
<BODY BGCOLOR="EEEEEE">
<CENTER>
<P ALIGN=CENTER>
<APPLET code="kap12/U1.class"
archive="test.jar"
width="1280"
height="720">
</APPLET>
</P>
</CENTER>
</BODY>
</HTML>
这是我的SSCCE:
package kap12;
import java.awt.FlowLayout;
import java.net.URL;
import javax.swing.ImageIcon;
import javax.swing.JApplet;
import javax.swing.JLabel;
public class U1 extends JApplet {
JLabel lbl0;
JLabel img0;
URL imgURL;
ImageIcon django = createImageIcon("resrc/django.jpg");
public void init() {
setLayout(new FlowLayout());
lbl0 = new JLabel("Test");
img0 = new JLabel(django);
getContentPane().add(img0);
getContentPane().add(lbl0);
img0.setVisible(true);
}
/** Returns an ImageIcon, or null if the path was invalid. */
protected static ImageIcon createImageIcon(String path) {
java.net.URL imgURL = U1.class.getClassLoader().getResource(path);
if (imgURL != null) {
System.out.println(""+imgURL);
return new ImageIcon(imgURL);
} else {
System.err.println("Couldn't find file: " + path);
return null;
}
}
}
我已经使用getClass()和getClass()。getClassLoader()进行了测试。我测试过在String路径中写“/resrc/django.jpg”。我已经和.jar一起测试了。我已经测试过将resrc-folder添加到kap12包文件夹中。看来我已经测试了一切。我花了好几天试图让它发挥作用。
我应该写什么?我在StackOverflow上已经阅读了很多相关内容,但没有成功。感谢。
更新:我已经测试了你写的所有东西,但无论如何都找不到它。
这是我从-tvf获得的:
C:\ Program \ Java \ jdk1.7.0_40 \ bin&gt; jar -tvf D:\ Path \ test.jar 25 Jan Jan 20 14:48:14 CET 2014 META-INF / MANIFEST.MF 2035年1月20日星期一14:48:04 CET 2014 pkg / U1.class 496057 Sun Feb 03 15:25:06 CET 2013 resrc / django.jpg
答案 0 :(得分:0)
ImageIcon django = createImageIcon("resrc/django.jpg");
应该是:
ImageIcon django = createImageIcon("/resrc/django.jpg");
不知道该怎么做但我从任务管理器中杀了“Java SE”,然后我删除了旧的.jar文件。我有一个
JOptionPane.showMessageDialog
,它说“String path”包含什么,似乎更新正常。
好的,'更新正常'是重要的部分。为每个测试做同样的事情。
注意到加载方法的更精细细节:
protected static ImageIcon createImageIcon(String path) {
java.net.URL imgURL = U1.class.getClassLoader().getResource(path);
更安全的是:
protected ImageIcon createImageIcon(String path) {
java.net.URL imgURL = this.getClass().getResource(path);
我知道我指定的字符串适用于'上下文类加载器',但不能从static
方法调用。
如果 仍然失败,请转到命令行(例如Windows命令提示符或Linux / Unix控制台,并提供输出:
> jar -tvf path/to/the/test.jar