前言
最近做项目,发现一个比较有意思的问题,其实发现了问题的根源还是很好理解,但是如果突然看到会非常的难以理解。在Java项目中,明明包名错误了,居然可以正常编译打包,IDEA报错了,但是mvn命令正常执行,且class编译完成后为正确的结果。
demo
笔者故意把java文件不按照规则的目录,随便放一个地方,IDEA提示错误,且给出正确的操作逻辑。但是我们不管他,直接编译
结果是正确的编译到指定包名的目录,非常神奇,笔者第一眼看到时,去classpath路径怎么都找不到类class,而且IDEA报错,正奇怪为啥可以编译且classpath没有类呢,然后去查看代码,突然灵感出现,去正确的路径去找,果然找到了class文件。
表现奇特的地方:
1. 明明报错了,却能正确编译
2. 明明在那个目录的类,却编译后找不到
总结
其实发现了class还是很好理解的,java文件编译成class文件,依靠的不是目录,而是文件本身,package的定义在编译后实际上也是在class字节码常量池中,通过class的定义,和引用常量池的引用
其实常用池也是引用
所以从根源上,package就是全限定名的一部分,通过目录隔离的方式方便定位的,对于class文件是非常重要的,但是对于java文件,实际上不影响编译和实际class的精确生成和定位。另外java可以编译class,但是class不一定是java编译的,所以有kt,groovy等class虚拟机运行的其他语言。