zoukankan      html  css  js  c++  java
  • [转]java程序打包成jar,图片文件问题

    from: http://hnzhoujunmei.iteye.com/blog/808249

     

    问题描述: 
    在编写完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:aaaimagessample.gif 
    * D:aaaconf.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:imagessample.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),这需要您必须将图片和文本等文件的保存路径,和程序中指定的路径两者保持一致。

  • 相关阅读:
    网络协议 22
    网络协议 21
    网络协议 20
    网络协议 19
    网络协议 18
    网络协议 17
    网络协议 16
    网络协议 15
    网络协议 14
    .net 4.0 中的特性总结(五):并行编程
  • 原文地址:https://www.cnblogs.com/study-development/p/3549719.html
Copyright © 2011-2022 走看看