Java小程序可以';如果在本地运行,则无法在jar中找到资源
问题:在windows平台上本地运行时,Java小程序无法加载位于其jar内的资源。如果从web服务器启动而不是本地启动,或者如果在linux系统上本地启动,则相同的小程序可以加载资源。在所有情况下,小程序都是使用小程序标记启动的 复制步骤 1) 构建下面的小程序类代码,并创建一个包含以下内容的jar:Java小程序可以';如果在本地运行,则无法在jar中找到资源,java,applet,getresource,Java,Applet,Getresource,问题:在windows平台上本地运行时,Java小程序无法加载位于其jar内的资源。如果从web服务器启动而不是本地启动,或者如果在linux系统上本地启动,则相同的小程序可以加载资源。在所有情况下,小程序都是使用小程序标记启动的 复制步骤 1) 构建下面的小程序类代码,并创建一个包含以下内容的jar: TestApplet.class iconimg.png test.html META-INF文件夹(带有一行的标准清单:“清单版本:1.0”) 下面是我使用的图像png文件的链接: 文件
- TestApplet.class
- iconimg.png
- test.html
- META-INF文件夹(带有一行的标准清单:“清单版本:1.0”)
在进一步研究并发现这是一个仅限windows的问题后,我将此问题称为已解决 这几乎可以肯定是一个Java1.7.0.25错误。小程序在web服务器上运行良好,在虚拟Ubuntu系统(在windows上使用VirtualBox)上本地运行良好。希望我提交的bug报告能对java用户有所帮助
谢谢你的回复。顺便说一句,是Joop关于区分大小写的评论促使我测试linux系统只是为了好玩。谢谢你 在进一步研究并发现这是一个仅限windows操作系统的问题后,我称之为已解决的问题 这几乎可以肯定是一个Java1.7.0.25错误。小程序在web服务器上运行良好,在虚拟Ubuntu系统(在windows上使用VirtualBox)上本地运行良好。希望我提交的bug报告能对java用户有所帮助
谢谢你的回复。顺便说一句,是Joop关于区分大小写的评论促使我测试linux系统只是为了好玩。谢谢你 Oracle已决定修改getDocumentBase()、getCodeBase()和getResource()的行为,因为自Windows上的1.7.0_25以来的安全原因:
关于此更改似乎有很多讨论,因为它破坏了一些重要的有效和安全的用例。Oracle决定修改getDocumentBase()、getCodeBase()和getResource()的行为,因为自Windows上的1.7.025以来的安全原因:
似乎有很多关于这一变化的讨论,因为它破坏了一些重要的有效和安全的用例。1)要更快地获得更好的帮助,请发布一篇文章。复制不应超过几行。2) 尝试搜索&如果没有找到类似的内容,请提交新报告。看看Oracle对此有何评论。试试
TestApplet.class.getResource(“/test.html”)代码>也是。检查区分大小写的命名;尤其是Apache可以在错误的大小写中找到名称。谢谢你的建议。我编辑了我的第一篇文章,使之更加简洁,并且(希望)遵循SSCCE格式。我搜索了bug数据库,并将其报告为bug。希望我所做的不是我看不到的愚蠢的事情:)也对Joop-我尝试了getResource(“/test.html”)和其他变体,如./test,但结果是一样的。有趣的是,小程序在EclipseApplet查看器中使用“test.html”、“test.html”甚至“\test.html”,但不使用“/test.html”。更新-测试小程序在ubuntu上使用最新版本的java和冰茶在本地运行良好。因此,很明显,这是windows特有的问题,可能是1.7.0_25/40-ea特有的。1)为了更快地获得更好的帮助,请发布一个。复制不应超过几行。2) 尝试搜索&如果没有找到类似的内容,请提交新报告。看看Oracle对此有何评论。试试TestApplet.class.getResource(“/test.html”)代码>也是。检查区分大小写的命名;尤其是Apache可以在错误的大小写中找到名称。谢谢你的建议。我编辑了我的第一篇文章,使之更加简洁,并且(希望)遵循SSCCE格式。我搜索了bug数据库,并将其报告为bug。希望我所做的不是我看不到的愚蠢的事情:)也对Joop-我尝试了getResource(“/test.html”)和其他变体,如./test,但结果是一样的。有趣的是,小程序在EclipseApplet查看器中使用“test.html”、“test.html”甚至“\test.html”,但不使用“/test.html”。更新-测试小程序在ubuntu上使用最新版本的java和冰茶在本地运行良好。很明显,这是windows特有的问题,可能是1.7.0_25/40-ea特有的。
<h1>Text from test.html file</h1>
<html><center><title>Test Applet</title><applet
archive = "test.jar"
code = "TestApplet.class"
name = "Test Applet"
width = "250"
height = "150"
hspace = "0"
vspace = "0"
align = "middle"
mayscript = "true"
></applet></center></html>
import java.applet.AppletContext;
import java.io.IOException;
import java.net.URL;
import javax.swing.ImageIcon;
import javax.swing.JApplet;
import javax.swing.JEditorPane;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class TestApplet extends JApplet {
public TestApplet() {
try {
jbInit();
} catch (Exception ex) {
ex.printStackTrace();
}
}
public void init() {
JPanel topPanel = new JPanel();
JLabel iconLabel;
URL url = TestApplet.class.getClassLoader().getResource("iconimg.png");
if (url != null)
iconLabel = new JLabel(new ImageIcon(url));
else
iconLabel = new JLabel("getResource(iconimg.png)==null");
topPanel.add(iconLabel);
URL url2;
url2 = TestApplet.class.getClassLoader().getResource("test.html");
if (url2 == null) {
JLabel errorLabel = new JLabel("getResource(test.html) == null");
topPanel.add(errorLabel);
} else {
try {
JEditorPane htmlPane = new JEditorPane(url2);
topPanel.add(htmlPane);
} catch (IOException ioe) {
System.err.println("Error displaying " + url2);
}
}
getContentPane().add(topPanel);
}
private void jbInit() throws Exception { }
}