- 浏览: 1517118 次
- 性别:
- 来自: 厦门
博客专栏
-
Spring 3.x企业实...
浏览量:461547
文章分类
最新评论
-
JyeChou:
学习Spring必学的Java基础知识(1)----反射 -
hhzhaoheng:
...
《Spring4.x企业应用开发实战》光盘资料下载 -
renlongnian:
//assertReflectionEquals(user1, ...
单元测试系列之3:测试整合之王Unitils -
骑着蜗牛超F1:
huang_yong 写道我的经验是,只需定义三层:1.ent ...
Spring的事务管理难点剖析(2):应用分层的迷惑 -
wangyudong:
工具地址貌似更新了哦https://github.com/Wi ...
几种常用的REST webservice客户端测试工具
使用如下方式读取JAR中的文件出错
类路径下放了一个jarfile.jar,如下所示:
如上所示,com/yyy/1.txt放在jarfile.jar中。
我原来使用如下的方式读取这个JAR中的文件:
@Test public void usingSpringMethod() throws Throwable { PathMatchingResourcePatternResolver patternResolver = new PathMatchingResourcePatternResolver(); Resource[] resources = patternResolver.getResources("com/yyy/1.txt"); if (resources != null && resources.length > 0) { File file = resources[0].getFile();//<---① FileInputStream inputStream = new FileInputStream(file); InputStreamReader inputStreamReader = new InputStreamReader(inputStream); char[] data = new char[100]; inputStreamReader.read(data); assertEquals((new String(data)).trim(), "ddddd"); } }
运行后,抛出异常,其问题出在①处,原因是:JAR中的文件无法以File方式返回,而只有在文件系统中的类资源才可以以File的形式返回。
但是,不管是文件系统中的类资源,还是JAR中的类资源文件,都可以以流的形式读取,因此,如上的代码调整一下就正常了:
@Test public void usingSpringMethod() throws Throwable { PathMatchingResourcePatternResolver patternResolver = new PathMatchingResourcePatternResolver(); Resource[] resources = patternResolver.getResources("com/yyy/1.txt");//<--② if (resources != null && resources.length > 0) { InputStreamReader inputStreamReader = new InputStreamReader(resources[0].getInputStream());//<---① char[] data = new char[100]; inputStreamReader.read(data); assertEquals((new String(data)).trim(), "ddddd"); } }
上面①处,使用resource[0].getInputStream()代替原来的
引用
resources[0].getFile()
。当然,②处的资源路径表达式,可以使用Spring的其它方式表示:
方式1:
Resource[] resources = patternResolver.getResources("classpath:com/yyy/1.txt");
方式2:
Resource[] resources = patternResolver.getResources("classpath*:com/yyy/1.txt");
直接原生的JDK方式读取
Spring对资源路径的表达方式非常灵活,这是我们首选使用Spring加载资源的原因。当然,使用JDK原生的ClassLoader也可以加载JAR中的资源文件,如下所示:
@Test public void usingJDKMethod() throws Throwable { URL url = getClass().getClassLoader().getResource("com/yyy/1.txt");//<--① InputStreamReader inputStreamReader = new InputStreamReader(url.openStream()); char[] data = new char[100]; inputStreamReader.read(data); assertEquals((new String(data)).trim(), "ddddd"); }
唯一的限制是,在①处不再支持classpath:或classpath*:的前缀了。
评论
4 楼
youjianbo_han_87
2012-10-09
您的Spring 3.X 这本书定价对于学生一族太贵了,
3 楼
stamen
2012-04-14
jinnianshilongnian 写道
你没贴全内容?
这个跟jar包没关系,跟classpath有关
之前我总结过下边四种方式
1、获取本地文件系统资源(不推荐使用,最后没招时使用)
File
2、获取当前类所在目录下的资源
MyServlet.class.getResourceAsStream(name)
3、获取Classpath资源
Thread.currentThread().getContextClassLoader().getResourceAsStream(name)
或
getClass().getClassLoader.getResourceAsStream(name)
4、读取web上下文下资源
ServletContext.getResourceAsStream(name)
//这个只返回文件系统类路径资源,不会包含jar包路径
Enumeration<URL> urls = new MyTest().getClass().getClassLoader().getResources("");
//这个即返回文件系统类路径资源,也包含jar包路径
Enumeration<URL> urls = new MyTest().getClass().getClassLoader().getResources("META-INF/MANIFEST.MF");
在“com.springsource.cn.sf.cglib-2.2.0.jar”里包含“asm-license.txt”文件,对于使用“classpath*: asm-*.txt”进行通配符方式加载资源将什么也加载不了“asm-license.txt”文件,注意一定是模式路径匹配才会遇到这种问题。这是由于“ClassLoader”的“getResources(String name)”方法的限制,对于name为“”的情况将只返回文件系统的类路径,不会包换jar包根路径。
对于“resolver.getResources("classpath*:asm-*.txt");”,由于在项目“resources”目录下没有所以应该返回0个资源;“resolver.getResources("classpath*:asm-license.txt");”将返回jar包里的Resource;“resolver.getResources("classpath*:LICENS*");”,因为将只返回文件系统类路径资源,所以返回1个资源。
因此在通过前缀“classpath*”加载通配符路径时,必须包含一个根目录才能保证加载的资源是所有的,而不是部分。
http://jinnianshilongnian.iteye.com/blog/1416322
这个跟jar包没关系,跟classpath有关
之前我总结过下边四种方式
1、获取本地文件系统资源(不推荐使用,最后没招时使用)
File
2、获取当前类所在目录下的资源
MyServlet.class.getResourceAsStream(name)
3、获取Classpath资源
Thread.currentThread().getContextClassLoader().getResourceAsStream(name)
或
getClass().getClassLoader.getResourceAsStream(name)
4、读取web上下文下资源
ServletContext.getResourceAsStream(name)
//这个只返回文件系统类路径资源,不会包含jar包路径
Enumeration<URL> urls = new MyTest().getClass().getClassLoader().getResources("");
//这个即返回文件系统类路径资源,也包含jar包路径
Enumeration<URL> urls = new MyTest().getClass().getClassLoader().getResources("META-INF/MANIFEST.MF");
在“com.springsource.cn.sf.cglib-2.2.0.jar”里包含“asm-license.txt”文件,对于使用“classpath*: asm-*.txt”进行通配符方式加载资源将什么也加载不了“asm-license.txt”文件,注意一定是模式路径匹配才会遇到这种问题。这是由于“ClassLoader”的“getResources(String name)”方法的限制,对于name为“”的情况将只返回文件系统的类路径,不会包换jar包根路径。
@Test public void testClasspathAsteriskPrefixLimit() throws IOException { ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); //将首先通过ClassLoader.getResources("")加载目录, //将只返回文件系统的类路径不返回jar的跟路径 //然后进行遍历模式匹配 Resource[] resources = resolver.getResources("classpath*:asm-*.txt"); Assert.assertTrue(resources.length == 0); //将通过ClassLoader.getResources("asm-license.txt")加载 //asm-license.txt存在于com.springsource.net.sf.cglib-2.2.0.jar resources = resolver.getResources("classpath*:asm-license.txt"); Assert.assertTrue(resources.length > 0); //将只加载文件系统类路径匹配的Resource resources = resolver.getResources("classpath*:LICENS*"); Assert.assertTrue(resources.length == 1); }
对于“resolver.getResources("classpath*:asm-*.txt");”,由于在项目“resources”目录下没有所以应该返回0个资源;“resolver.getResources("classpath*:asm-license.txt");”将返回jar包里的Resource;“resolver.getResources("classpath*:LICENS*");”,因为将只返回文件系统类路径资源,所以返回1个资源。
因此在通过前缀“classpath*”加载通配符路径时,必须包含一个根目录才能保证加载的资源是所有的,而不是部分。
http://jinnianshilongnian.iteye.com/blog/1416322
分析得非常好,特别是对直接放在根路径下的文件的分析,这是很容易出错的地方。
2 楼
stamen
2012-04-14
呵呵,真是没有写全,今天补上了。
1 楼
jinnianshilongnian
2012-04-13
你没贴全内容?
这个跟jar包没关系,跟classpath有关
之前我总结过下边四种方式
1、获取本地文件系统资源(不推荐使用,最后没招时使用)
File
2、获取当前类所在目录下的资源
MyServlet.class.getResourceAsStream(name)
3、获取Classpath资源
Thread.currentThread().getContextClassLoader().getResourceAsStream(name)
或
getClass().getClassLoader.getResourceAsStream(name)
4、读取web上下文下资源
ServletContext.getResourceAsStream(name)
//这个只返回文件系统类路径资源,不会包含jar包路径
Enumeration<URL> urls = new MyTest().getClass().getClassLoader().getResources("");
//这个即返回文件系统类路径资源,也包含jar包路径
Enumeration<URL> urls = new MyTest().getClass().getClassLoader().getResources("META-INF/MANIFEST.MF");
在“com.springsource.cn.sf.cglib-2.2.0.jar”里包含“asm-license.txt”文件,对于使用“classpath*: asm-*.txt”进行通配符方式加载资源将什么也加载不了“asm-license.txt”文件,注意一定是模式路径匹配才会遇到这种问题。这是由于“ClassLoader”的“getResources(String name)”方法的限制,对于name为“”的情况将只返回文件系统的类路径,不会包换jar包根路径。
对于“resolver.getResources("classpath*:asm-*.txt");”,由于在项目“resources”目录下没有所以应该返回0个资源;“resolver.getResources("classpath*:asm-license.txt");”将返回jar包里的Resource;“resolver.getResources("classpath*:LICENS*");”,因为将只返回文件系统类路径资源,所以返回1个资源。
因此在通过前缀“classpath*”加载通配符路径时,必须包含一个根目录才能保证加载的资源是所有的,而不是部分。
http://jinnianshilongnian.iteye.com/blog/1416322
这个跟jar包没关系,跟classpath有关
之前我总结过下边四种方式
1、获取本地文件系统资源(不推荐使用,最后没招时使用)
File
2、获取当前类所在目录下的资源
MyServlet.class.getResourceAsStream(name)
3、获取Classpath资源
Thread.currentThread().getContextClassLoader().getResourceAsStream(name)
或
getClass().getClassLoader.getResourceAsStream(name)
4、读取web上下文下资源
ServletContext.getResourceAsStream(name)
//这个只返回文件系统类路径资源,不会包含jar包路径
Enumeration<URL> urls = new MyTest().getClass().getClassLoader().getResources("");
//这个即返回文件系统类路径资源,也包含jar包路径
Enumeration<URL> urls = new MyTest().getClass().getClassLoader().getResources("META-INF/MANIFEST.MF");
在“com.springsource.cn.sf.cglib-2.2.0.jar”里包含“asm-license.txt”文件,对于使用“classpath*: asm-*.txt”进行通配符方式加载资源将什么也加载不了“asm-license.txt”文件,注意一定是模式路径匹配才会遇到这种问题。这是由于“ClassLoader”的“getResources(String name)”方法的限制,对于name为“”的情况将只返回文件系统的类路径,不会包换jar包根路径。
@Test public void testClasspathAsteriskPrefixLimit() throws IOException { ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); //将首先通过ClassLoader.getResources("")加载目录, //将只返回文件系统的类路径不返回jar的跟路径 //然后进行遍历模式匹配 Resource[] resources = resolver.getResources("classpath*:asm-*.txt"); Assert.assertTrue(resources.length == 0); //将通过ClassLoader.getResources("asm-license.txt")加载 //asm-license.txt存在于com.springsource.net.sf.cglib-2.2.0.jar resources = resolver.getResources("classpath*:asm-license.txt"); Assert.assertTrue(resources.length > 0); //将只加载文件系统类路径匹配的Resource resources = resolver.getResources("classpath*:LICENS*"); Assert.assertTrue(resources.length == 1); }
对于“resolver.getResources("classpath*:asm-*.txt");”,由于在项目“resources”目录下没有所以应该返回0个资源;“resolver.getResources("classpath*:asm-license.txt");”将返回jar包里的Resource;“resolver.getResources("classpath*:LICENS*");”,因为将只返回文件系统类路径资源,所以返回1个资源。
因此在通过前缀“classpath*”加载通配符路径时,必须包含一个根目录才能保证加载的资源是所有的,而不是部分。
http://jinnianshilongnian.iteye.com/blog/1416322
发表评论
-
狂魔型代码改造记
2016-10-22 13:02 2102功能需求 统计员工指定月:在职员工数,入职员工数,离职员 ... -
关于JAR包版本冲突的几个应对招数总结
2016-08-02 12:05 9570概述 Javeer们一定遇到过NoSuchMethod ... -
关于Websphere 会话管理若干奇葩问题
2015-12-09 20:45 4392引言 由于最近 ... -
几种常用的REST webservice客户端测试工具
2015-07-30 16:11 9579引言 开发了Rest WebService服务后,如果方便快捷 ... -
如何通过项目配置文件指定Log4J的配置文件
2015-07-28 21:47 12745引言 在打造易于部署的WEB应用项目 一文中,我们介绍了如何对 ... -
打造易于部署的WEB应用项目
2015-07-27 16:46 2954概述 很多WEB应用的配置文件位于项目的类路径下(如WEB-I ... -
ROCA Resource-oriented Client Architecture
2014-03-21 18:16 1677ROCA Resource-oriented Client ... -
一个常见的Spring IOC疑难症状
2013-07-25 14:14 4952Case 请看下面的IOC实例: 1)Aa ... -
mybatis3.1分页自动添加总数
2013-07-08 21:11 22700问题 1.mybatis默认分页是内存分页的,谁用谁崩溃啊! ... -
关于Idea testng单元测试乱码的解决
2013-07-02 10:50 14095问题 我是使用intel ... -
网络技术专业名词
2012-11-07 15:30 1487MRTG 求助编辑百科名片 Multi Router Tr ... -
ETL及BI开源工具
2012-08-01 16:17 55611. Kettle Kettle是一款 ... -
HMAC简介
2012-06-11 12:38 5550HMAC简介 HMAC的典型应用 ... -
学习Spring必学的Java基础知识(9)----HTTP请求报文
2012-06-09 16:02 13858引述要学习Spring框架的技术内幕,必须事先掌握一些基本的J ... -
关于权限管理的一点小思考
2012-05-26 15:32 2431做任何系统组织结构和权限管理是必不可少的,同时也是最重要的,实 ... -
看看人家写东西的速度
2012-05-14 16:08 2166以下是GIT的开发日志: 2005 年4月3日 开始开发GIT ... -
学习Spring必学的Java基础知识(4)----XML基础知识
2012-05-12 15:33 8480引述要学习Spring框架的 ... -
学习Spring必学的Java基础知识(3)----PropertyEditor
2012-05-12 15:13 16753引述要学习Spring框架的 ... -
明明白白AOP(傻瓜也会心领神会!)
2012-05-05 11:04 10497引子: AOP(面向方面编 ... -
学习Spring必学的Java基础知识(2)----动态代理
2012-05-02 13:03 9604引述要学习Spring框架的 ...
相关推荐
NULL 博文链接:https://konghaibo.iteye.com/blog/430146
主要介绍了解决SpringBoot jar包中的文件读取问题实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
本篇文章主要介绍了spring boot加载第三方jar包的配置文件的方法,详细的介绍了spring boot jar包配置文件的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
在程序中读取Spring 配置文件,通过Spring框架获得Bean,完成相应的操作 在上面是我们的开发流程,我们第一步一般都是导入所需jar包,但由于刚开始时根本不知道该在什么时候用到哪些jar包,所以这里事先不导入jar包...
Spring mvc Aop+annotation实现系统日志记录功能实现的jar包asm-3.3.jar ,aspectjrt.jar , aspectjweaver.jar , cglib-nodep-2.1_3.jar , spring-aop.jar
支持从当前运行的spring boot工程jar包中读取javascript,css文件。支持在请求URL携带字符编码名称获取相应的字符编码格式的js、css文件。支持替换css文件中url引用资源的相对路径为可访问的绝对路径。支持使用yui...
如果不想使用默认的application.properties,而想将属性文件放到jar包外面,怎么做呢?下面小编给大家带来了两种方法解决Spring Boot 把配置文件和日志文件放到jar外部问题,感兴趣的朋友一起看看吧
基于接口、抽象类实现不停机动态调整代码的目的,将修改后的源码文件放置于指定目录下,读取文件后执行动态编译方法,即可将该类重新加载,新的类可以在Spring容器从新注册,且仅在当前窗口生效。如果重启了服务或...
6.8.1. 在Spring中使用AspectJ来为domain object进行依赖注入 6.8.1.1. @Configurable object的单元测试 6.8.1.2. 多application context情况下的处理 6.8.2. Spring中其他的AspectJ切面 6.8.3. 使用Spring IoC来...
poi读取大数据量excel文件,避免内存溢出,行级操作 根据本网站的资源修改的。 将一些类路径错误全部进行了修正。 另外,需要自己在类路径里,放spring-context.jar和spring-beans.jar包。
自己实现httpSession,在getSession中获取cookie,从cookie中读取sessionId, 如果没有sessionId就新创建session,如果有sessionId,就去redis中查看是否有此id的记录,如果没有就新建session,如果有,还是新建...
spring 重新动态加载数据库或xml中的bean,可以不用重启tomcat
主要介绍了springboot项目打成jar包后无法获取static下的静态资源文件的问题分析,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
它支持读取XLS和XLSX文件,后者还具有(实验性)流支持。 PoiItemReader具有最多的功能,但同时也是最耗费内存的,并且可能导致大型XLS(X)工作表出现内存问题。 为了减少内存占用,可以使用...
使用 Spring Boot 的优势 使用 Spring Boot 开发项目,会给我们带来非常美妙的开发体验,可以从以下几个方面展开来说明 ...Spring Boot Test 中包含了我们需要使用的各种测试场景,满足我们日常项目的测试需求。
该项目使用的jar包为以下. spring-beans.jar xwork-2.0.4.jar spring-context.jar ognl-2.6.11.jar spring-web.jar spring-core.jar struts2-core-2.0.11.1.jar commons-logging-...
commons-configuration2-2.0.jar Apache commons-configuration 读取配置文件
ehcache所需jar包 ...ehcache-spring-annotations-1.2.0.jar guava-13.0.1.jar ehcache-terracotta-2.5.2.jar slf4j-api-1.6.1.jar slf4j-log4j12-1.6.1.jar terracotta-toolkit-1.5-runtime-4.2.0.jar
本项目为spring操作MySQL数据库的一个小例子,实现了数据库增删查改,外部jar包和数据库齐全,下载导入到eclipse运行即可
全注解配置Spring3+SpringMVC+Hibernate4,Eclipse含jar,导入直接使用。 数据库使用Oracle,可以按照配置文件dataSource的内容建用户。 访问http://localhost/eap将调用FileManagerControl的getFileServerList方法...