经过多年的Java开发,我惊讶地发现编译器没有检查包名是否真的是与Java源文件路径对应的包名。
你可以写这个:
package abcd;
class Xyz {
}
并且它将编译,即使Xyz.java位于efgh文件夹中。我在Netbeans中编辑文件时收到警告,但就是这样。事实上,这导致了一个很难发现的错误:http://netbeans.org/bugzilla/show_bug.cgi?id=197320
无论如何都可以获得警告或错误?
答案 0 :(得分:2)
这不是错误;这是一个不便之处。您可以将每个.java文件放在一个目录中,每个类都在不同的包中,并且仍然可以正确编译并获得与类包相匹配的输出结构。
答案 1 :(得分:2)
使用gnu-find,您可以搜索整个项目。 cd到项目源根目录,然后:
find PROJECT -type f -name "*.java" -exec ./pmatchd.sh {} ";"
您需要pmatchd.sh - 脚本:
#!/bin/bash
#
dir=$(dirname $1)
d=${dir//\//.}
headline=$(head -n1 $1)
p=${headline#package }
if [[ $d";" != $p ]]
then
echo "mismatch: " + $d " " + $p + " " + $1
fi
如果你喜欢它,你会将它移动到路径中的某个位置,而不是$ PWD。 p>
答案 2 :(得分:1)
包名称只是命名空间。它可以转换为文件路径,大多数类加载器希望在
之类的位置找到已编译的类文件<classpath-entry>/packagename.replace(".","/")/classname.class
(但这是类加载器业务)
答案 3 :(得分:0)
Eclipse不允许这样做,并将其显示为编译错误。如果Netbeans只是将其显示为警告,您可以将其更改为在编译设置中显示为错误。