Java小程序可以';如果在本地运行,则无法在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文件的链接: 文件

问题:在windows平台上本地运行时,Java小程序无法加载位于其jar内的资源。如果从web服务器启动而不是本地启动,或者如果在linux系统上本地启动,则相同的小程序可以加载资源。在所有情况下,小程序都是使用小程序标记启动的

复制步骤

1) 构建下面的小程序类代码,并创建一个包含以下内容的jar:

  • TestApplet.class
  • iconimg.png
  • test.html
  • META-INF文件夹(带有一行的标准清单:“清单版本:1.0”)
下面是我使用的图像png文件的链接:

文件test.html有一行:


在进一步研究并发现这是一个仅限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 { }
}