沧海残阳 2015-02-25 07:59 采纳率: 100%
浏览 2650
已采纳

包含图片的jar包导出问题

麻烦各位大神,
我的JAVA程序,在MyEclipse里面是可以运行的,
但是作为jar包导出后,加载的图片资源都不见了. 代码如下:
图片说明

然后我的图片资源路径是image这个文件夹, 关系如下:
图片说明

请问我应该怎么改呢?

  • 写回答

1条回答

  • 微wx笑 Java领域优质创作者 2015-02-25 09:28
    关注

    问题描述:
    在编写完Java程序后,打包成Jar时发布,会发现找不到Jar文件中的图片和文本文件,其原因是程序中载入图片或文本文件时,使用了以当前工作路径为基准的方式来指定文件和路径。这与用户运行Jar包时的当前工作路径并不一致。

    问题分析:
    例如:以Windows为例说明,以下是开发项目“AAA”的部分代码,开发和调试时的根路径为D:\aaa,这样程序运行时当前路径为"D:\aaa",大家可以用System.getProperty("user.dir")方法求证当前用户工作路径。

    //下面代码使用了基于当前工作路径的方式指定了文件对象
    File imageFile = new File("/images/sample.gif");
    ImageIcon imageIcon = new ImageIcon(File.toURI);
    File iniFile = new File("/conf.ini");
    FileInputStream fileInputStream = new FileInputStream(iniFile.toURI);
    /*
    *这样程序会去找以下两个文件:

    • D:\aaa\images\sample.gif
    • D:\aaa\conf.ini */

    以上的代码应用绝对路径信息指定了文件对象,在开发和调试期(未打包前),是没有问题的,但在打包后,由于所有图片文件和文本文件都将打包到Jar文件 中,由于System中的"user.dir"属性发生了变化,会造成用绝对路径的方式无法找到Jar文件中包含路径和文件。例如大家将上面的项目 “AAA”中的所有类文件、图片文件和文本文件等打包为E:\aaa.jar文件并发布,在用户执行该aaa.jar中的程序时,当前路径取决于用户运行 该程序的当前路径。

    例如: 在“E:\”目录下运行该程序:

    E:> java -jar aaa.jar

    此时用户的当前路径(System的user.dir属性)是“E:\”,而非开发者所期望的“E:\aaa”,所以会按以下路径来搜索文件:
    E:\images\sample.gif
    E:\conf.ini
    但是所有的图片和文本文件包含在E:\aaa.jar文件中,所以会致使程序无法正常运行。

    问题解决:

    为了解决上述问题,推荐采用Java本身以类为基准的路径搜索方式。
    例如:
    /*
    *以下代码采用了以当前类为基准的路径指定方式。下面这行代码在运行时,会
    *在jar文件中的根路径,搜索程序中用到的文件。
    Reader reader =new InputStreamReader(
    getClass().getResourceAsStream("/image/Environment.ini"));
    ImageIcon i=new ImageIcon(getClass().getResource("/image/b1.gif"));

    以上两行代码采用了下面两条Java语句:
    getClass().getResourceAsStream("FileName");
    getClass().getResource("File");
    含有这种代码的程序在运行时,以类(类路径)为基准,而不依赖当前路径(System中的user.dir)。

    注意:上面的路径"/image/Environment.ini"如果写成"image/Environment.ini",将表示在类同路径下的路径 (className/image/Environment.ini),这需要您必须将图片和文本等文件的保存路径,和程序中指定的路径两者保持一致。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?