【问题标题】:Is there any way to find classes with bad package name in Netbeans?有没有办法在 Netbeans 中找到包名错误的类?
【发布时间】:2011-07-29 22:16:02
【问题描述】:

经过多年的 Java 开发,我震惊地得知编译器不会检查包名是否真的与 Java 源文件的路径对应。

可以这样写:

package abcd; 
class Xyz {
}

编译甚至是Xyz.java位于efgh文件夹中。我在 Netbeans 中编辑文件时收到警告,但仅此而已。事实上,这导致了一个很难发现的错误:http://netbeans.org/bugzilla/show_bug.cgi?id=197320

有什么方法可以得到警告或错误?

【问题讨论】:

  • 使用 Eclipse。包错会报错。
  • 我想 javac 允许这样做是因为你有 -d 选项理论上可以清理它。
  • javac -d 不会解决这个问题。我不想让javac解决这个问题,我只是想让它报告它。

标签: java netbeans compiler-errors package


【解决方案1】:

这不是错误;这是一个不便。您可以将每个 .java 文件放在一个目录中,每个类在不同的包中,并且仍然可以正确编译并获得与类的包相匹配的输出结构。

【讨论】:

  • 您的陈述是正确的,但我想知道如何在编译时报告不便之处。
【解决方案2】:

Eclipse 不允许这样做,并将其显示为编译错误。如果 Netbeans 只是将此显示为警告,您可以将其更改为在编译设置中显示为错误。

【讨论】:

  • Netbeans 使用 javac,所以问题适用于它。
【解决方案3】:

包名只不过是一个命名空间。它可以转换为文件路径,并且大多数类加载器都希望在类似的位置找到已编译的类文件

<classpath-entry>/packagename.replace(".","/")/classname.class

(但那是类加载器业务)

【讨论】:

    【解决方案4】:

    使用 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 中。

    【讨论】:

    • 好主意,我可以将这部分作为我们持续集成过程的一部分...我会检查并尽快回来:-)
    • 但是,如果可能的话,我宁愿使用 Java 生态系统中的一些东西
    • 我明白这一点,但这对我来说工作量太大了。然而,有一些改进是可能的:脚本应该在没有cding 到目录的情况下工作。也许'package'语句并不总是在第一行。我想在 scala 中你可以用 30 行,Java 100 行来完成。 :)
    • 实际上,我一直在寻找一些编译器开关或一些工具,它是发行版的一部分。好像不存在。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-19
    • 1970-01-01
    • 1970-01-01
    • 2014-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多