转自:http://blog.csdn.net/wangpeng047/article/details/8202353
仅作个人参考记录。
之前,我曾经写过一篇Java遍历包中所有类,但经过一名网友提醒发现,只能适用于项目src中的包,当包在jar里时就无法遍历jar里的类。就此我针对代码进行了细化,功能得到进一步的完善。
在分享源码之前,先说说我在遍历jar包中的类时所遇到的困难。
这是我测试用的jar包,结构如下:
无论包是在src中还是在jar中,其实根本的思路还是根据给的包域名(如:com.wang.vo.request.hotel.test)定位到包的资源对象。包在src中,我们可以把它当做文件File来进行处理,因此在src中包是以文件夹的形式来体现的,但在jar中,包的含义是有些不同的,我们不能把它当做File来对待(这样你或得到的是jar的File对象)。那么怎么才能获取jar里包的资源对象呢?
代码如下:
- 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却不一定非要用过文件夹目录来展示。
我们可以用下面这段代码来进一步说明这个问题
- 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包,运行结果如下:
- 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包,运行结果如下:
- 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总是为空的原因了。
相关推荐
Caused by: java.util.jar.JarException: file:/opt/code/signal-Server-master/target/TextSecureServer-1.87.jar has unsigned entries - org/whispersystems/dispatch/DispatchManager$4.class at javax.crypto....
bcprov-jdk16-1.46.jar
Bouncy Castle用于 Java 平台的开放源码的轻量级密码术包,它支持大量的密码术算法。
注:下文中的 *** 代表文件名中的版本号。 # 【bcprov-jdk15on-***.jar中文-英文对照文档.zip】 中包含: 中文-英文对照文档:【bcprov-jdk15on-***-javadoc-API文档-中文(简体)-英语-对照版.zip】 jar包下载地址...
解决org.bouncycastle.jcajce.provider.asymmetric.rsa.DigestSignatureSpi$SHA256问题,亦或是报BC错。 如下:首先在jdk包中 编辑jdk1.8_014\jre\lib\...其次,把bcprov-jdk16-1.45.jar添加到到 jre\lib\ext目录中
Registry entries and MFC class that associates a file extension with a program.(20KB)
在使用spring mvc 使用反射自动生成对象 的代码 方便使用
注:如果jar包引用不当,则依然不能发邮件 使用步骤:1、先将jar包放入到ant%home%下的lib文件夹下,比如我的ant%home%是:D:\apache-ant-1.7.0\lib 2、eclipse---preferences---Ant---Runtime---Ant Home Entries...
最新版本bouncycastle156,适用jdk1.5 - jdk1.8,来源于官网。
pdfbox-1.8.9.jar java抽取pdf文档所需jar包。
java中用于处理pdf文件的jar包。
参考:https://blog.csdn.net/yangbutao/article/details/12911487
apache-maven-3.6.3-bin.zip apache-maven-3.8.8-bin.zip apache-maven-3.9.1-bin.zip freeSSHd.exe freeFTPd.exe gitblit-1.9.2 pdfbox-2.0.28.jar
温馨提示,如果你关联源码的时候,出现提示:“The Jar of this class file belongs to container 'Android Dependencies' which does not allow modifications to source attachments on its entries”那是因为你把...
赠送jar包:bcprov-jdk15on-1.59.jar; 赠送原API文档:bcprov-jdk15on-1.59-javadoc.jar; 赠送源代码:bcprov-jdk15on-1.59-sources.jar; 赠送Maven依赖信息文件:bcprov-jdk15on-1.59.pom; 包含翻译后的API文档...
赠送jar包:bcprov-jdk14-1.38.jar; 赠送原API文档:bcprov-jdk14-1.38-javadoc.jar; 赠送源代码:bcprov-jdk14-1.38-sources.jar; 赠送Maven依赖信息文件:bcprov-jdk14-1.38.pom; 包含翻译后的API文档:bcprov...
ABAP for all entries使用中注意的问题
英汉汉英手机词典.jar this dictionary is for mobile which can execute jar applications,this dictionary have 283788 entries(words) from english to chinese and from chinese to english
可处理解压如下异常问题 only DEFLATED entries can have EXT descriptor
13.2.2. Removing cache entries 13.3. Declaring caching in XML 13.4. Summary Chapter 14. Securing methods 14.1. Securing methods with annotations 14.1.1. Restricting method access with @Secured 14.1.2....