之前,我曾经写过一篇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总是为空的原因了。

好了,这个问题解决了之后,那么如何利用Java遍历jar包中所有类的问题也前进了一大步了,我将在下一篇博文中正是分享源码。

============友情链接============

Java遍历包中所有类-终续 http://blog.csdn.net/wangpeng047/article/details/8206427

Java遍历包中所有类 http://blog.csdn.net/wangpeng047/article/details/8124390

Java遍历jar包所有类-后续相关推荐

  1. Java 覆盖 jar 包内的方法

    背景 有时候在 java 开发过程中会遇到这样的场景,比如说我们需要用 jar 包里的方法,但是 jar 包里的方法又不能满足当前的业务逻辑需要,而想直接下载 jar 包源码修改的话又会很麻烦,这个时 ...

  2. java -jar 停止_推荐:Linux启动Java程序jar包Shell脚本

    每次启动Java程序jar包的时候,难道你还在手敲java -jar xxserver.jar--?边敲边想着都需要追加哪些参数? 今天就推荐给大家一个几乎通用的Shell脚本,它支持Java程序Ja ...

  3. Java常见Jar包的用途

    jar包 用途 axis.jar SOAP引擎包 commons-discovery-0.2.jar 用来发现.查找和实现可插入式接口,提供一些一般类实例化.单件的生命周期管理的常用方法. jaxrp ...

  4. Eclipse插件开发中对于外部Jar包和类文件引用的处理(彻底解决插件开发中的NoClassDefFoundError问题)...

    目的:Eclipse插件开发中,经常要引用第三方包或者是引用其他插件中的类,由于插件开发环境引用类路径的设置和运行平台引用类路径的设置不同,经常导致开发过程OK,一旦运行则出现NoClassDefFo ...

  5. JAVA常用jar包简介

    java开发中主要用到的jar包介绍 commons-io.jar: 可以看成是java.io的扩展,用来帮助进行IO功能开发.它包含三个主要的领域:Utilityclasses-提供一些静态方法来完 ...

  6. java常用jar包详解

    1.dt.jar SUN对于dt.jar的定义:Also includes dt.jar, the DesignTime archive of BeanInfo files that tell int ...

  7. java获取jar包中的文件资源

    java获取jar包中的文件资源 一.问题示例 1.1 项目开发时 1.2 打包成jar后 二.解决方案 2.1 解决方法 2.2 实现 问题描述:   我们常常在代码中读取一些资源文件(比如图片,音 ...

  8. Java中jar包怎么使用_java中jar包的使用方法

    java中jar包的使用方法 发布时间:2020-06-23 11:08:05 来源:亿速云 阅读:162 作者:Leah 这篇文章将为大家详细讲解有关java中jar包的使用方法,小编觉得挺实用的, ...

  9. java执行jar包

    java执行jar包 一般运行包含manifest的jar包,可以使用 java -jar <jar-file-name>.jar 如果jar里没有 manifest,则可以使用 java ...

最新文章

  1. vibe前景提取算法示例代码
  2. python显示无效语法怎么处理-python – 无效语法(对于循环括号/括号)
  3. AES加密算法的详细简介
  4. CSS3属性animation-play-state控制动画运行或暂停的技巧
  5. Spring思维导图,让Spring不再难懂(ioc篇)
  6. e3是合法浮点数吗_下面4个选项中,均是合法浮点数的选项是?
  7. linux获取进程信息函数
  8. IDM出现输入用户名和密码不能下载解决方法
  9. R语言与机器学习学习笔记(分类算法)
  10. 推荐 | 一个超好的OpenCV4学习社区
  11. Python实现四个经典小游戏合集
  12. Linux下手机驱动安装
  13. html5 java文件上传插件_5个最佳的javascript文件上传插件
  14. linux英英词典项目,[开发手记] 一款基于命令行的英英词典 (A CLI-Based EE Dictionary)...
  15. sklearn中多种编码方式——category_encoders(one-hot多种用法)
  16. java小游戏之捕鱼达人,学了java,妈妈不再担心我去网吧游戏厅了!
  17. dedecms织梦模板|响应式粉红色母婴月嫂源码 母婴育儿类网站模板(自适应手机版)
  18. 潮玩艺术盛会来杭州了
  19. 用python做数值计算_用python进行数据分析的基本步骤和方法
  20. RTSP SDP RTP/RTCP介绍

热门文章

  1. 传感器SensorManager
  2. promethuesa监控 告警(二)
  3. Delphi的多线程开发实例
  4. z-index细解:一个z-index的值很大为何却在一个很小的值下面?
  5. 量化交易入门阶段——欧奈尔的CANSLIM模型(S 供需关系)
  6. DSP/DMP/SSP/RTB概念解释
  7. Windows下 wget 的安装与使用
  8. 吐槽百度网盘限速,这种操作太恶心了
  9. eclipse IDE
  10. 【时间函数】gettimeofday