获取jar包内部的资源文件
通常获取一个资源文件很简单,问题是对于jar包内的资源文件,可能会发生意外。假如这里有一个文件操作的类:
public class FileLoader {
public boolean exists(){
URL resource = FileLoader.class.getResource("/library/a.txt");
if(resource==null){
return false;
}
File f = new File(resource.getFile());
return f.exists();
}
public static void main(String[] args) throws IOException {
FileLoader f = new FileLoader();
System.out.println(f.exists());
}
}
运行main方法它会读取当前根路径下(src/bin)的资源文件,假如存在目录library和子文件a.txt,这里会打印出true;
现在把这段代码和资源文件打成myfile.jar并运行在一个myeclipse工程中,我们期望也是打印true。然而控制台打印false;将其引入到war工程在tomcat中运行,依然打印false。
也就是说,资源文件的使用类无法找到自己,jar包正常的功能将无法提供。这是一个常见的关于jar路径的问题。
为了试验,在上面的FileLoader类中增加一个方法
public void printPath(){
System.out.println("/目录: "+ FileLoader.class.getResource("/").getPath());
System.out.println("\"\"目录: "+ FileLoader.class.getResource("").getPath());
System.out.println("/library目录: "+ FileLoader.class.getResource("/library").getPath());
}
运行后打印结果为:
/目录: /D:/Workspaces/ruleengine/file/target/classes/
""目录: /D:/Workspaces/ruleengine/file/target/classes/com/file/
/library目录: /D:/Workspaces/ruleengine/file/target/classes/library
重新打包后引入到一个当前myeclipse工程中,一定要以jar包的形式引入,不能通过myeclipse直接关联myfile工程。调用printPath后打印结果为:
/目录: /D:/Workspaces/ruleengine/schoolaround/target/test-classes/
""目录: file:/D:/Workspaces/ruleengine/schoolaround/lib/myfile.jar!/com/file/
/library目录: file:/D:/Workspaces/ruleengine/schoolaround/lib/myfile.jar!/library
显而易见,获取jar包中的文件路径的格式已经变为*.jar!*(除了第一个),这种格式的路径,不能通过new File的方式找到文件。目前本人也没有找到其它处理方式,欢迎评论指点。在这种情况下,如果想让jar读取到自己的资源文件,可以通过类加载器的getResourceAsStream方法来解决。
修改FileLoader类的exists方法如下:
public boolean exists() throws IOException{
InputStream resource = FileLoader.class.getResourceAsStream("/library/a.txt");
if(resource==null){
return false;
}
return true;
}
这时无论是在哪里引入myfile.jar,执行exists方法时都会打印true。也就是说,资源文件一定能够被读取到。
参考文章: https://blog.csdn.net/luo_jia_wen/article/details/50057191
获取jar包内部的资源文件的更多相关文章
- java 从jar包中读取资源文件
在代码中读取一些资源文件(比如图片,音乐,文本等等),在集成环境(Eclipse)中运行的时候没有问题.但当打包成一个可执行的jar包(将资源文件一并打包)以后,这些资源文件找不到,如下代码: Jav ...
- (转)java 从jar包中读取资源文件
(转)java 从jar包中读取资源文件 博客分类: java 源自:http://blog.csdn.net/b_h_l/article/details/7767829 在代码中读取一些资源文件 ...
- 深入jar包:从jar包中读取资源文件getResourceAsStream
一.背景 我们常常在代码中读取一些资源文件(比如图片,音乐,文本等等). 在单独运行的时候这些简单的处理当然不会有问题.但是,如果我们把代码打成一个jar包以后,即使将资源文件一并打包,这些东西也找不 ...
- SpringBoot的配置文件加载顺序以及如何获取jar包里的资源路径
一.读取配置文件的四种方式 这四种配置文件放置方式的读取优先级依次递减,具体可以查看官方文档. 1.1jar包同级目录下的config文件夹里的配置文件 其实我以前就见过这种方式了,只是不知道怎么做的 ...
- 【解惑】深入jar包:从jar包中读取资源文件
[解惑]深入jar包:从jar包中读取资源文件 http://hxraid.iteye.com/blog/483115 TransferData组件的spring配置文件路径:/D:/develop/ ...
- Jar中的Java程序如何读取Jar包中的资源文件
Jar中的Java程序如何读取Jar包中的资源文件 比如项目的组织结构如下(以idea中的项目为例): |-ProjectName |-.idea/ //这个目录是idea中项目的属性文件夹 |-s ...
- Android将Activity 打 jar包 (解决资源文件不能打包的问题)
转载地址:http://blog.csdn.net/xiaanming/article/details/9257853 最近有一个需要,我们公司做了一个apk客户端,然后其他的公司可以根据自己的需要来 ...
- [Java基础] 深入jar包:从jar包中读取资源文件
转载: http://hxraid.iteye.com/blog/483115?page=3#comments 我们常常在代码中读取一些资源文件(比如图片,音乐,文本等等).在单独运行的时候这些简单的 ...
- JAR包中读取资源文件
我们常常在代码中读取一些资源文件(比如图片,音乐,文本等等).在单独运行的时候这些简单的处理当然不会有问题.但是,如果我们把代码打成一个jar包以后,即使将资源文件一并打包,这些东西也找不出来了.看看 ...
随机推荐
- windows下bower init 报错: bower ENOINT Register requires an interactive shell
windows下bower初始化时不应该在git bash中,而应该在cmd下打开的dos窗口中进行
- Oracle数据库提权(低权限提升至dba)
0x01 Oracle存储过程”缺陷” 在 Oracle 的存储过程中,有一个有趣的特点:运行权限.运行权限分为两种,definer 和 invoker. definer 为函数创建者的权限,而 in ...
- Python 爬取豆瓣TOP250实战
学习爬虫之路,必经的一个小项目就是爬取豆瓣的TOP250了,首先我们进入TOP250的界面看看. 可以看到每部电影都有比较全面的简介.其中包括电影名.导演.评分等. 接下来,我们就爬取这些数据,并将这 ...
- html、css、javascript之间的关系
网页主要由三部分组成: 结构( Structure) . 表现( Presentation) 和行为( Behavior)HTML —— 结构, 决定网页的结构和内容( “是什么”)CSS —— 表现 ...
- Java Web项目中使用Freemarker生成Word文档遇到的问题
这段时间项目中使用了freemarker生成word文档.在项目中遇到了几个问题,在这里记录一下.首先就是关于遍历遇到的坑.整行整行的遍历是很简单的,只需要在整行的<w:tr></w ...
- python 之 pygame
学习pygame如果不了解pygame是什么的可以产考百度或者去官网去看介绍pygame急忙趁着三分的热度,整理一下关于pygame的相关内容,顺便复习一下Markdown编辑器 pygame的介绍 ...
- linux系统状态网络、权限、用户大杂烩
来来来,我们聊一下liunx系统相关的知识!! 首先从查询网络配置开始 ifconfig 查询.设置网卡和ip等参数 ifup,ifdown 脚本命令,更简单的方式启动关闭网络 ip命令是结合了ifc ...
- vue element NavMenu 莫名出现蓝色边框
最近在开发一款官网,使用的是element,在头菜单NavMenu,的时候没有设置任何的边框属性,结果出现了如下图所示的边框线. 点击有二级菜单时出现 找了好多方法发现是有一个属性影响到了,:focu ...
- C#数据转换
C 货币 2.5.ToString("C") ¥2.50 D 十进制数 25.ToString("D5") 00025 E 科学型 25000.ToString ...
- C#+Selenium抓取百度搜索结果前100网址
需求 爬取百度搜索某个关键字对应的前一百个网址. 实现方式 VS2017 + Chrome .NET Framework + C# + Selenium(浏览器自动化测试框架) 环境准备 创建控制台应 ...