当前位置: 首页 > 知识库问答 >
问题:

如果在本地运行,Java小程序在jar中找不到资源

楮自珍
2023-03-14

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

复制的步骤

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

  • 测试应用程序。等级

以下是指向我使用的图像png文件的链接:http://flexibleretirementplanner.com/java/java-test/iconimg.png

文件测试。html有一行:

<h1>Text from test.html file</h1>

2) 创建启动。html与测试位于同一文件夹中。jar如下:

<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>

3)test.jar和launch.html在同一个本地文件夹中,点击launch.html

4) 请注意,getResource()调用imgicon。png和测试。html都返回null。

5) 上载启动。html和测试。jar到web服务器并加载启动。请注意,找到了这些资源。

测试应用程序。Java语言

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 { }
}

共有2个答案

卢深
2023-03-14

在进一步研究并发现这是一个仅限windows的问题后,我将此称为已回答的问题。

几乎可以肯定这是一个java 1.7.0.25 bug。小程序在web服务器上运行良好,在虚拟Ubuntu系统(在windows上使用VirtualBox)上本地运行良好。希望我提交的bug报告能对java人员有所帮助。

感谢您的回复。顺便说一句,是Joop关于区分大小写的评论促使我测试linux系统只是为了好玩。谢谢你!

柯阳曦
2023-03-14

Oracle已决定修改getDocumentBase()、getCodeBase()和getResource()的行为,因为自Windows上1.7.0\u 25以来的安全原因:http://www.duckware.com/tech/java-security-clusterfuck.html

似乎有很多关于这个变化的讨论,因为它破坏了一些重要的有效和安全的用例。

 类似资料:
  • 我正在使用一个在线编译器来运行这个简单的代码,但是它给出了一个运行时错误,“Could not find or load class main”没有其他语法错误。请提出解决方案。

  • 我正在做一个项目,编译并运行我的IDE工作正常。所有资源都找到了,它正常工作。然而,当我构建我的. jar时,它能够找到一些资源,但不是全部。我的项目结构看起来是这样的: 当我运行jar文件时,它能够找到图像并使用它们,但是当我尝试访问html文件时,它不会打开。下面是jar的项目结构; 我以前从未处理过jar文件,所以这似乎是我犯的一个非常明显的错误。感谢您的帮助,谢谢! 编辑:访问找不到的文件

  • 我有一个程序,必须从终端界面播放声音。 代码相当简单,如下所示: 该文件位于“我的源路径”中的“音乐”文件夹中。 当我在eclipse中运行程序时,所有工作都非常好。但是如果我将其导出到. jar文件中并在windows cmd中尝试它,我会收到这条消息 [编辑]音频文件确实已打包到中。jar,但它仍然不起作用。 是否有可能播放来自windows提示符的声音?如果没有,是否有这样的声音? 谢谢Si

  • 我一直试图提交一个简单的python脚本,以便在一个带有Yarn的集群中运行它。当我在本地执行作业时,没有问题,一切都很好,但当我在集群中运行它时,它就失败了。 诊断:文件不存在:hdfs://myserver:8020/user/josholsan/.sparkstaging/application_1510046813642_0010/test.py 我不知道为什么它找不到test.py,我也

  • 我有一个可运行的jar文件,无法访问位于默认src目录之外的资源。根据我的理解,这两门课的区别是什么。getResource()和ClassLoader。getResource(),我应该能够访问root/res/img/img1。png(请参阅下面的文件夹设置),方法是使用以下getResourceFile函数: 文件夹设置: 当我尝试执行jar可执行文件本身时,问题就出现了。然而,奇怪的是,我

  • SRC: 主要: HTML: 2018-09-21 10:47:15.253错误4048---[nio-8080-exec-1]org.THYMELEAF.TemplateEngine:[THYMELEAF][http-nio-8080-exec-1]异常处理模板“index”:解决模板“index”时出错,模板可能不存在,或者任何已配置的模板解析程序都无法访问 TemplateInputExce