`

(转)为什么jar没有生成directory entries,jar中的class就不能被Spring扫描到呢?

阅读更多

转自: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里包的资源对象呢?

代码如下:

[java] view plaincopy
 
  1. public static void main(String[] args) throws Exception {  
  2.     String packageName = "com/wang/vo/request/hotel/test";  
  3.     URL url = Thread.currentThread().getContextClassLoader().getResource(packageName);  
  4.     if (url != null) {  
  5.         System.out.println(url.getPath());  
  6.     }  
  7. }  

但是通过上述代码,运行后却发现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
 
  1. public static void main(String[] args) throws Exception {  
  2.     // 项目中jar包所在物理路径  
  3.     String jarName = "E:/Work/stsf_skisok_product/WebRoot/WEB-INF/lib/testpackage.jar";  
  4.     JarFile jarFile = new JarFile(jarName);  
  5.     Enumeration<JarEntry> entrys = jarFile.entries();  
  6.     while (entrys.hasMoreElements()) {  
  7.         JarEntry jarEntry = entrys.nextElement();  
  8.         System.out.println(jarEntry.getName());  
  9.     }                 
  10. }  

默认生成的jar包,运行结果如下:

[plain] view plaincopy
 
  1. META-INF/MANIFEST.MF  
  2. com/wang/util/DateStyle.class  
  3. com/wang/util/PropertiesUtil$1.class  
  4. com/wang/util/PropertiesUtil.class  
  5. com/wang/util/Week.class  
  6. com/wang/util/DateUtil.class  
  7. com/wang/vo/request/hotel/test/PopularCityRequest.class  
  8. com/wang/vo/request/hotel/test/EconomicsRequest.class  
  9. com/wang/vo/request/hotel/test/HotelProductVouchRequest.class  
  10. com/wang/vo/request/hotel/test/QueryOrderListRequest.class  
  11. com/wang/vo/request/hotel/test/HotelListQueryRequest.class  
  12. com/wang/vo/request/hotel/test/RoomReserveRequest.class  
  13. com/wang/vo/request/hotel/test/HotelOneQueryRequest.class  
  14. com/wang/vo/request/hotel/test/HotelBrandRequest.class  

如果勾选Add directory entries选项生成的jar包,运行结果如下:

[plain] view plaincopy
 
  1. META-INF/MANIFEST.MF  
  2. com/  
  3. com/wang/  
  4. com/wang/util/  
  5. com/wang/util/DateStyle.class  
  6. com/wang/util/PropertiesUtil$1.class  
  7. com/wang/util/PropertiesUtil.class  
  8. com/wang/util/Week.class  
  9. com/wang/util/DateUtil.class  
  10. com/wang/vo/  
  11. com/wang/vo/request/  
  12. com/wang/vo/request/hotel/  
  13. com/wang/vo/request/hotel/test/  
  14. com/wang/vo/request/hotel/test/PopularCityRequest.class  
  15. com/wang/vo/request/hotel/test/EconomicsRequest.class  
  16. com/wang/vo/request/hotel/test/HotelProductVouchRequest.class  
  17. com/wang/vo/request/hotel/test/QueryOrderListRequest.class  
  18. com/wang/vo/request/hotel/test/HotelListQueryRequest.class  
  19. com/wang/vo/request/hotel/test/RoomReserveRequest.class  
  20. com/wang/vo/request/hotel/test/HotelOneQueryRequest.class  
  21. com/wang/vo/request/hotel/test/HotelBrandRequest.class  

这样也就解释了为何打成jar包后用getResource获取资源url总是为空的原因了。

分享到:
评论

相关推荐

    Spring自动扫描无法扫描jar包中bean的解决方法

    不勾选"Add directory entries"时,jar包内部的类文件会按照扁平化的结构存储,这样Spring在扫描时无法定位到类的正确位置,因此无法加载Bean。而勾选这个选项后,jar包内的类文件会被组织成具有完整目录结构的形式...

    MyEclipse中生成.jar文件的方法

    在MyEclipse这款强大的Java集成开发环境中,生成.jar文件是一项常用的任务,这通常涉及到将一个或多个类或者整个项目打包成可执行的Java应用程序或库。以下是在MyEclipse中生成.jar文件的详细步骤,以及一些相关的...

    springboot动态加载jar包到容器中,并映射为接口

    ### Spring Boot 动态加载 Jar 包到容器中并映射为接口的技术解析 #### 一、背景介绍 在实际的开发过程中,我们经常会遇到这样的需求:系统需要根据不同的业务场景来动态地加载不同的功能模块或者组件。这些功能...

    Java的包扫描实现和Jar应用.docx

    在Spring框架中,这种机制被广泛用于自动装配和组件扫描,以便在启动时识别和初始化相关的bean。在自定义的项目中,我们也可以利用这个特性来动态发现和管理类,例如插件系统中的类加载。 在Java中,我们可以利用...

    如何打jar包,教你如何打jar包

    在Java开发中,将项目打包成JAR(Java Archive)文件是常见的操作,这有助于将所有类、资源和依赖集中到一个可执行的文件中,方便分发和运行。本教程将详细介绍如何手把手地创建一个JAR包。 首先,确保你已经安装了...

    删除jar包中的指定文件

    标题“删除jar包中的指定文件”涉及到的是Java开发中对已打包JAR文件进行操作的知识点。在Java中,JAR(Java Archive)文件是一种归档格式,用于将多个类文件和其他资源组合到一个单一的文件中,方便分发和执行。...

    所有java的Jar包

    - **依赖管理**:在大型项目中,JAR文件常用于组织和管理第三方库,如Spring、Hibernate等。 - **Web应用**:在Servlet容器中,如Tomcat,WAR文件(Web应用的扩展形式,基于JAR)包含Web应用的所有资源。 - **分布式...

    从jar文档中读取文件

    基于 Java 技术的打包方案,Java 档案 (Java Archive, JAR) 文件允许开发人员把所有相关的内容 (.class、图片、声音和支持文件等) 打包到一个单一的文件中。JAR 文件格式支持压缩、身份验证和版本,以及许多其它特性...

    Eclipse 打jar包(fat jar)操作步骤(内含截图)

    首先,我们需要理解为什么需要fat jar。在Java项目中,通常会有很多第三方库作为依赖,这些库通常以JAR格式存在。如果直接打包项目为JAR,运行时需要将项目JAR和所有依赖JAR放置在同一目录下。而fat jar则将所有依赖...

    java 读取jar包文件

    如果你的文件是在运行时类路径中,你可以使用`ClassLoader`来获取输入流,这样就不需要直接处理`JarFile`了。例如: ```java InputStream in = getClass().getResourceAsStream("/path/to/target_file_name"); ...

    将myEclipse中的java项目发布成jar

    ### 如何将MyEclipse中的Java项目发布成可执行的JAR文件 在软件开发过程中,经常需要将Java项目打包成可执行的JAR文件,以便于部署和分发。本文将详细介绍如何在MyEclipse环境中完成这一过程,并提供相关的步骤和...

    win7 解决导出jar包提示 can not find the main class

    4. 在“JAR Export”向导中,勾选“Add manifest file to JAR”选项,并在下方的“Manifest entries”中输入主类名,例如: ``` Main-Class: com.example.MainClass ``` 5. 完成其他设置后,点击“Finish”完成...

    Java实现从jar包中读取指定文件的方法

    在Java编程中,有时我们需要从已经打包的JAR文件中读取特定的资源文件,例如配置文件、图片或库。本篇文章将详细讲解如何在Java中实现从JAR包中读取指定文件的方法。 首先,Java提供了`java.util.jar`包,其中包含...

    用反射解析jar文件并执行里面Java代码

    在Java编程语言中,反射(Reflection)是一种强大的工具,它允许程序在运行时检查和操作类、接口、字段以及方法等对象。通过反射,我们可以在不知道具体类名的情况下实例化对象,调用方法,访问和修改私有成员,以及...

    程序可能用到的Jar文件

    2. 主类:若JAR文件包含可执行的Java应用程序,清单文件需指定主类,这样通过`java -jar jarfile.jar`就能直接运行。 三、使用JAR文件 1. 运行:除了指定主类的JAR文件可以直接运行,还可以通过`java -cp jarfile....

    国密依赖包bcprov-jdk16-1.46.jar

    在实际使用中,将bcprov-jdk16-1.46.jar添加到Java项目的类路径中,就可以直接调用相应的API来使用这些国密算法。例如,你可以创建SM2的公钥和私钥对,使用SM3来计算消息的哈希值,或者利用SM4进行数据的加密和解密...

    java_made-Jar-and-exe-file.rar_jar exe_made

    对于Windows用户,JAR文件不能直接双击运行,需要将其转换为EXE。这通常涉及使用第三方工具,如Launch4j、JAR2EXE或Excelsior Jet。这些工具会创建一个Windows可执行文件,其中包含Java运行时环境和JAR文件。 - *...

    bcprov-jdk16-1.46.jar

    这个版本号表示这是Bouncy Castle的某个历史版本,可能在某些特定环境中被需要,因为较旧的Java版本可能不支持更新的加密库。 标签"jar"表明这是一个Java Archive文件,它是Java平台的标准归档格式,用于封装多个类...

    java 导出 jar 文件 执行批处理

    Java平台上的程序通常被打包成JAR(Java Archive)文件,便于分发和执行。`jar`文件是一种归档格式,它将多个类文件、资源文件和其他相关文件组合在一起,以便于作为一个整体运行或部署。在Java开发中,导出JAR文件...

    15分钟学会MyEclipse导出jar文件再装换成exe执行

    1. **使用FatJar插件**:为了将项目的多个依赖库合并到一个单独的JAR文件中,可以使用名为“FatJar”的插件。 2. **安装FatJar插件**: - **下载并解压插件**:从官方网站http://sourceforge.net/projects/fjep/...

Global site tag (gtag.js) - Google Analytics