在编写完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),这需要您必须将图片和文本等文件的保存路径,和程序中指定的路径两者保持一致。

导出含有图片的项目成jar文件后运行,图片不显示的更多相关文章

  1. 关于Java项目打包成Runnable jar文件后运行时图片不显示的问题

    现象:在eclipse中能够无误运行,但导出Runnable jar后运行jar包时不显示图片. 原因:路径问题. 方法1: 新建一个文件夹.文件夹中放那个jar包和image文件夹.在这种情况下,双 ...

  2. Idea项目添加新文件后运行出现404问题

    今天在项目里添加了一个新的html文件,然后运行项目页面跳转出现了404问题,找不到页面,经过我的一番查找,我注意到了Idea项目下有一个target文件,然后上网搜了解到这个target文件是mav ...

  3. Eclipse中将含有图片资源的项目打包成jar文件

    前言: 最近学了GUI编程和UDP协议,心血来潮想做一个局域网内的聊天软件,前期都还算顺利,直到后来将整个项目打包成jar文件时遇到了困难.如图: 自己设置的图标不见了,但是也没有默认的图标,说明图片 ...

  4. 怎样把引用的jar包和本项目一起导出成jar文件

    之所以要导出Runnable JAR.是由于我们希望将引用到的Jar包与本项目一起进行导出,所以不要选Jar file 选File/Export...然后Java/Runnable JAR file, ...

  5. Eclipse将引用了第三方jar包的Java项目打包成jar文件的两种方法

    方案一:用Eclipse自带的Export功能 步骤1:准备主清单文件 “MANIFEST.MF”, 由于是打包引用了第三方jar包的Java项目,故需要自定义配置文件MANIFEST.MF,在该项目 ...

  6. 将引用了第三方jar包的Java项目打包成jar文件的两种方法

    方案一:用Eclipse自带的Export功能 步骤1:准备主清单文件 “MANIFEST.MF”, 由于是打包引用了第三方jar包的Java项目,故需要自定义配置文件MANIFEST.MF,在该项目 ...

  7. Eclipse项目中引用第三方jar包时将项目打包成jar文件的两种方式

    转载自:http://www.cnblogs.com/lanxuezaipiao/p/3291641.html 方案一:用Eclipse自带的Export功能 步骤1:准备主清单文件 “MANIFES ...

  8. Android项目实战(二十四):项目包成jar文件,并且将工程中引用的jar一起打入新的jar文件中

    前言: 关于.jar文件: 平时我们Android项目开发中经常会用到第三方的.jar文件. 其实.jar文件就是一个类似.zip文件的压缩包,里面包含了一些源代码,注意的是.jar不包含资源文件(r ...

  9. 如何在eclipse将程序导出成jar文件

    如何在eclipse将程序导出成jar文件 听语音 | 浏览:916 | 更新:2015-08-22 17:57 1 2 3 4 5 6 7 分步阅读 一键约师傅 百度师傅为你的电脑系统,选个靠谱师傅 ...

随机推荐

  1. 使用Telerik控件搭建Doubanfm频道部分

    今天感觉好累啊..还是坚持记录下. 收集的API: https://github.com/HakurouKen/douban.fm-api https://github.com/zonyitoo/do ...

  2. 网络开发库从libuv说到epoll

    引言 这篇博文可能有点水,主要将自己libuv的学习过程和理解. 简单谈方法. 有点杂. 那我们开始吧. 首先介绍 githup . 这个工具特别好用. 代码托管. 如果不FQ可能有点卡. 但是应该试 ...

  3. C语言中进制知识总结

    1.什么是进制 进制是一种计数的方式,常用的有二进制.八进制.十进制.十六进制.任何数据在计算机内存中都是以二进制的形式存放的. 我对进制的个人理解,二进制数是以2为计算单元,满2进1位的数:八进制数 ...

  4. SQL Server基础

    一.常用命令 1.使用命令行开启SQL Server服务 获取管理员权限的命令行工具: net start mssqlserver 开启sql server服务 net restart mssqlse ...

  5. hdu 5327 Olympiad

    题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5327 Olympiad Description You are one of the competit ...

  6. C#.Net 图片处理大全

    C# How to: Image filtering by directly manipulating Pixel ARGB values C# How to: Image filtering imp ...

  7. Entity Framework 泛型使用

    因为增删改查是我们常用到的方法,我们不可能每个数据模型都去完成增删改查,这样的办法太笨拙了.我们可以写个父类(包含增删改查),然后让所有的数据模型类继承该父类.那就要求我们的父类必须使用泛型来实现. ...

  8. [原创]一个纯css实现兼容各种主流移动pc浏览器的时间轴

    废话不多说 Demo 高度完全的自适应 中心思想是table 和第二列行高的50%的上下绝对定位竖线 第一次用codepen less完全不能用啊 连node png之类的都是关键词会被去掉... 马 ...

  9. 16.如何设置Quartus II Programmer,保护pof不被读出

    Program时,把security bit勾上,点击start 这样examine时就不能正确的读出pof 读出来的pof 除文件头外,其余的内容全为0 怎么样,大家试试!

  10. [SSH服务]——SSH端口转发

    实验拓扑图 实验描述 假设有三台主机A.B.C.B和A.C可以连通,AC两台主机不能连通. 这时候可以用本地端口转发,来实现A和C通过B来连通. 实验中,为了构造上述环境,我们使用三台虚拟机,其网络环 ...