myeclipse 生成jar包后,spring无法扫描到bean定义
2016-09-09 15:24
381 查看
之前,我曾经写过一篇Java遍历包中所有类,但经过一名网友提醒发现,只能适用于项目src中的包,当包在jar里时就无法遍历jar里的类。就此我针对代码进行了细化,功能得到进一步的完善。
在分享源码之前,先说说我在遍历jar包中的类时所遇到的困难。
这是我测试用的jar包,结构如下:
无论包是在src中还是在jar中,其实根本的思路还是根据给的包域名(如:com.wang.vo.request.hotel.test)定位到包的资源对象。包在src中,我们可以把它当做文件File来进行处理,因此在src中包是以文件夹的形式来体现的,但在jar中,包的含义是有些不同的,我们不能把它当做File来对待(这样你或得到的是jar的File对象)。那么怎么才能获取jar里包的资源对象呢?
代码如下:
[java] view
plaincopy
public static void main(String[] args) throws Exception {
String packageName = "com/wang/vo/request/hotel/test";
URL url = Thread.currentThread().getContextClassLoader().getResource(packageName);
if (url != null) {
System.out.println(url.getPath());
}
}
但是通过上述代码,运行后却发现url始终为空,尝试过各种获取资源的办法(如getResourceAsStream),均无法解决,我试了试其他的jar包(如spring的),却发现相同的代码url却有值。经过我反复的测试和分析发现,问题出现在生成jar包的方式上,即所谓打jar包。
一般来说,我们打jar包的步骤大致如下:
之后一直默认,然后Finish。这样看似没问题,但问题出现在这一步:
这种默认方式生成的jar包中,只含有class文件,而并没有我们大众所知的文件夹目录结构。可能我们大多数人认为com.test.Student类,Student类文件就应该在com文件夹下的test文件夹里,这其实是片面的,是一个误区!
com.test真正的含义是package包域名,就好比.net里的命名空间,它只是为了区分、汇总、唯一标识不同的类而提出的概念,跟文件夹目录层次结构是两回事,我们只是习惯上用文件夹目录来展示package而已。但package却不一定非要用过文件夹目录来展示。
我们可以用下面这段代码来进一步说明这个问题
[java] view
plaincopy
public static void main(String[] args) throws Exception {
// 项目中jar包所在物理路径
String jarName = "E:/Work/stsf_skisok_product/WebRoot/WEB-INF/lib/testpackage.jar";
JarFile jarFile = new JarFile(jarName);
Enumeration<JarEntry> entrys = jarFile.entries();
while (entrys.hasMoreElements()) {
JarEntry jarEntry = entrys.nextElement();
System.out.println(jarEntry.getName());
}
}
默认生成的jar包,运行结果如下:
[plain] view
plaincopy
META-INF/MANIFEST.MF
com/wang/util/DateStyle.class
com/wang/util/PropertiesUtil$1.class
com/wang/util/PropertiesUtil.class
com/wang/util/Week.class
com/wang/util/DateUtil.class
com/wang/vo/request/hotel/test/PopularCityRequest.class
com/wang/vo/request/hotel/test/EconomicsRequest.class
com/wang/vo/request/hotel/test/HotelProductVouchRequest.class
com/wang/vo/request/hotel/test/QueryOrderListRequest.class
com/wang/vo/request/hotel/test/HotelListQueryRequest.class
com/wang/vo/request/hotel/test/RoomReserveRequest.class
com/wang/vo/request/hotel/test/HotelOneQueryRequest.class
com/wang/vo/request/hotel/test/HotelBrandRequest.class
如果勾选Add directory entries选项生成的jar包,运行结果如下:
[plain] view
plaincopy
META-INF/MANIFEST.MF
com/
com/wang/
com/wang/util/
com/wang/util/DateStyle.class
com/wang/util/PropertiesUtil$1.class
com/wang/util/PropertiesUtil.class
com/wang/util/Week.class
com/wang/util/DateUtil.class
com/wang/vo/
com/wang/vo/request/
com/wang/vo/request/hotel/
com/wang/vo/request/hotel/test/
com/wang/vo/request/hotel/test/PopularCityRequest.class
com/wang/vo/request/hotel/test/EconomicsRequest.class
com/wang/vo/request/hotel/test/HotelProductVouchRequest.class
com/wang/vo/request/hotel/test/QueryOrderListRequest.class
com/wang/vo/request/hotel/test/HotelListQueryRequest.class
com/wang/vo/request/hotel/test/RoomReserveRequest.class
com/wang/vo/request/hotel/test/HotelOneQueryRequest.class
com/wang/vo/request/hotel/test/HotelBrandRequest.class
这样也就解释了为何打成jar包后用getResource获取资源url总是为空的原因了。
在分享源码之前,先说说我在遍历jar包中的类时所遇到的困难。
这是我测试用的jar包,结构如下:
无论包是在src中还是在jar中,其实根本的思路还是根据给的包域名(如:com.wang.vo.request.hotel.test)定位到包的资源对象。包在src中,我们可以把它当做文件File来进行处理,因此在src中包是以文件夹的形式来体现的,但在jar中,包的含义是有些不同的,我们不能把它当做File来对待(这样你或得到的是jar的File对象)。那么怎么才能获取jar里包的资源对象呢?
代码如下:
[java] view
plaincopy
public static void main(String[] args) throws Exception {
String packageName = "com/wang/vo/request/hotel/test";
URL url = Thread.currentThread().getContextClassLoader().getResource(packageName);
if (url != null) {
System.out.println(url.getPath());
}
}
但是通过上述代码,运行后却发现url始终为空,尝试过各种获取资源的办法(如getResourceAsStream),均无法解决,我试了试其他的jar包(如spring的),却发现相同的代码url却有值。经过我反复的测试和分析发现,问题出现在生成jar包的方式上,即所谓打jar包。
一般来说,我们打jar包的步骤大致如下:
之后一直默认,然后Finish。这样看似没问题,但问题出现在这一步:
这种默认方式生成的jar包中,只含有class文件,而并没有我们大众所知的文件夹目录结构。可能我们大多数人认为com.test.Student类,Student类文件就应该在com文件夹下的test文件夹里,这其实是片面的,是一个误区!
com.test真正的含义是package包域名,就好比.net里的命名空间,它只是为了区分、汇总、唯一标识不同的类而提出的概念,跟文件夹目录层次结构是两回事,我们只是习惯上用文件夹目录来展示package而已。但package却不一定非要用过文件夹目录来展示。
我们可以用下面这段代码来进一步说明这个问题
[java] view
plaincopy
public static void main(String[] args) throws Exception {
// 项目中jar包所在物理路径
String jarName = "E:/Work/stsf_skisok_product/WebRoot/WEB-INF/lib/testpackage.jar";
JarFile jarFile = new JarFile(jarName);
Enumeration<JarEntry> entrys = jarFile.entries();
while (entrys.hasMoreElements()) {
JarEntry jarEntry = entrys.nextElement();
System.out.println(jarEntry.getName());
}
}
默认生成的jar包,运行结果如下:
[plain] view
plaincopy
META-INF/MANIFEST.MF
com/wang/util/DateStyle.class
com/wang/util/PropertiesUtil$1.class
com/wang/util/PropertiesUtil.class
com/wang/util/Week.class
com/wang/util/DateUtil.class
com/wang/vo/request/hotel/test/PopularCityRequest.class
com/wang/vo/request/hotel/test/EconomicsRequest.class
com/wang/vo/request/hotel/test/HotelProductVouchRequest.class
com/wang/vo/request/hotel/test/QueryOrderListRequest.class
com/wang/vo/request/hotel/test/HotelListQueryRequest.class
com/wang/vo/request/hotel/test/RoomReserveRequest.class
com/wang/vo/request/hotel/test/HotelOneQueryRequest.class
com/wang/vo/request/hotel/test/HotelBrandRequest.class
如果勾选Add directory entries选项生成的jar包,运行结果如下:
[plain] view
plaincopy
META-INF/MANIFEST.MF
com/
com/wang/
com/wang/util/
com/wang/util/DateStyle.class
com/wang/util/PropertiesUtil$1.class
com/wang/util/PropertiesUtil.class
com/wang/util/Week.class
com/wang/util/DateUtil.class
com/wang/vo/
com/wang/vo/request/
com/wang/vo/request/hotel/
com/wang/vo/request/hotel/test/
com/wang/vo/request/hotel/test/PopularCityRequest.class
com/wang/vo/request/hotel/test/EconomicsRequest.class
com/wang/vo/request/hotel/test/HotelProductVouchRequest.class
com/wang/vo/request/hotel/test/QueryOrderListRequest.class
com/wang/vo/request/hotel/test/HotelListQueryRequest.class
com/wang/vo/request/hotel/test/RoomReserveRequest.class
com/wang/vo/request/hotel/test/HotelOneQueryRequest.class
com/wang/vo/request/hotel/test/HotelBrandRequest.class
这样也就解释了为何打成jar包后用getResource获取资源url总是为空的原因了。
相关文章推荐
- myeclipse 生成jar包后,spring无法扫描到bean定义
- myeclipse 生成jar包后,spring无法扫描到bean定义
- myeclipse 生成jar包后,spring无法扫描到bean定义
- Eclipse生成jar包后,Spring无法扫描到bean定义
- 用spring annotation声明的bean,当打包在jar中时,无法被扫描到的问题
- Spring自动扫描无法扫描到jar包中的bean的解决方案
- Myeclipse导出jar包,spring无法扫描jar包中类以及配置文件的解决办法
- 用spring annotation声明的bean,当打包在jar中时,无法被扫描到
- 用spring annotation声明的bean,当打包在jar中时,无法被扫描到
- 用spring annotation声明的bean,当打包在jar中时,无法被扫描到
- Spring自动扫描无法扫描jar包中bean的解决方法
- 用spring annotation声明的bean,当打包在jar中时,无法被扫描到
- Spring自动扫描无法扫描jar包中bean的解决方法(转)
- Myeclipse下打包spring+jms集成的项目,解决打成的jar包报无法找到xml的context的schema的问题
- Spring对注解(Annotation)处理源码分析1——扫描和读取Bean定义
- SSH框架中,无法用Myeclipse 反向工程生成Hibernate的SpringDAO,灰色不可用的解决办法
- spring无法扫描jar包的问题
- Spring对注解(Annotation)处理源码分析1——扫描和读取Bean定义
- Spring对注解(Annotation)处理源码分析1——扫描和读取Bean定义
- 有spring管理的项目打成jar包无法扫描到注解的问题解决