Java创建jar文件时文件夹名称需与包名一致的原因是什么
为什么打包jar时文件夹名必须和包名一致
这是Java类加载机制的硬性约定,核心原因如下:
- Java的包名本质是类的命名空间路径,JVM加载类时,会根据类的全限定名(包名+类名)拼接出固定的文件路径查找类文件。比如你声明的包名为
org.demo.utils,JVM要加载该包下的DateUtil类时,固定会去路径org/demo/utils/DateUtil.class查找资源,该规则对本地文件系统、jar包内资源都统一生效。 - 你使用的
jar cf anyName.jar packageName/*命令,作用是把当前路径下packageName文件夹的所有内容原封不动打包进jar包。如果这个文件夹名和实际包名不一致,jar包内部的目录结构就会和包名不匹配,JVM扫描jar包时找不到对应路径下的类文件,会直接抛出ClassNotFoundException或NoClassDefFoundError,哪怕类代码本身没有语法错误也无法正常使用。 - 如果你不用这种文件夹提前对齐的方式打包,也可以用
javac的-d参数自动生成符合包名规则的目录结构再打包,最终目的都是保证jar包内的目录结构和类的包声明完全匹配。
内容的提问来源于stack exchange,提问作者DCR
相关产品推荐
相关产品推荐

