司空见惯的包
作者:刘文敏
本文所说的包不是LV,也不是Chanel,而是Java语言中的包package,是Java程序员从写“Hello World”开始就接触的概念,Java引入包机制是为了更好的组织类,防止命名冲突,进行访问控制,提供搜索和定位类。
程序员对包的使用可以说是烂熟于心,但是笔者近日在自动构建后代码合规检查过程中发现了一个有趣的现象,某个Ant项目在自动构建时顺利通过,而代码合规检查的报告中则有许多类报声明的包”com.test“与期望的包”com.Test“不匹配这类错误,查看报错的源文件及文件目录,笔者发现源文件中写的是类似package com.test,而文件目录则为com\Test,笔者对Ant能编译通过深感好奇与困惑,立马写一个测试程序进行试验。
由于Ant用javac编译,代码合规检查是根据build.xml形成Eclipse项目,在Eclipse中编译,笔者分别进行试验。
- javac编译
包名package com.test 文件目录E:\tmp\src\com\Test
没有报编译错误,生成class所在目录和包名一致,是小写test目录,而没有生成大写Test。由于windows系统不区分大小写,其实目录名、文件名都小写也能正常编译。
但是运行时必须严格区分包名、类名的大小写,如下图:
那么Linux下当包名与文件目录不一致时是否会报错呢?不报错!
而且将源文件MyTest.java移到任意一个目录,只要javac能找到文件都能编译,且按包名的生成目录、生成类
- Eclipse编译
将文件导入Eclipse中编译,编译报错:声明的包”com.test“与期望的包”com.Test”不匹配,Eclipse执行了更严格的检查。
- 成因分析
由于在Eclipse中新建带包名的类,会自动生成相应的目录,代码重构重命名包名时,也会自动修改文件目录,所以很少出现上面的情况。经向项目组了解,此代码原来的包名是大写,从配置库获取代码,在本地Eclipse中将包名及文件目录修改为小写,再次提交到配置库时,由于配置库不区分目录大小写,配置库上的目录名没有修改,因此出现了包名与文件目录不一致的情况。
- 总结与建议
当包名与源文件目录不一致时,Ant可以编译通过,而Eclipse中会报编译错误,对应于项目投产构建即Ant构建步骤能成功,代码合规检查步骤则会报错。由于大部分程序员仍习惯于在Eclipse等IDE中编写代码,因此建议文件目录与包名保持一致,以避免一些无谓的错误。
原创文章,转载请注明: 转载自并发编程网 – ifeve.com本文链接地址: 司空见惯的包
暂无评论