问候,
我在Hudson中设置了一个简单的测试项目,项目的构建过程(批处理文件)生成了一个findbugs.xml文件。这是由Hudson的FindBugs插件处理的,但是它将错误的行号显示为“-1”而不是它们的实际行号。同事建议我为编译器启用调试信息。我为javac使用了-g“生成所有调试信息”选项,但似乎没有任何改变。我的构建命令是:
javac -g -classpath C:\testWebApp1\src -d C:\testWebApp1\build C:\testWebApp1\src\*.java
build.bat文件中唯一的另一件事是调用FindBug工具(文本UI)。以下是FindBugs插件关于第一个错误的内容:
File: GenerateHellos.java, Line: -1, Type: UUF_UNUSED_FIELD, Priority: Normal, Category: PERFORMANCE
有什么想法吗?万分感谢!
答案 0 :(得分:1)
这是答案的一半:
您在该类中声明了一个未使用的字段。 FindBugs使用字节代码的静态分析来查找错误;遗憾的是,字节代码格式不存储类或成员字段的行号,因此FindBugs实际上不能报告行号。必须有一些开关才能输出更多有用的信息(即字段的名称),但我不知道。
或者,您可以尝试PMD,这是一个噪音很大,但实际上是分析源代码和also integrates with Hudson。
进行了一些挖掘,看起来这可能是检查器中针对该错误模式的错误。假设您的FindBugs运行配置了一个适当的源目录(即使用-sourcepath
),发现的大多数错误都应该有与之关联的行号。要检查此项,请打开输出的报告。您应该看到如下元素:
<!-- skipping a bit -->
<BugInstance type="...">
<Class classname="com.example.MyClass">
<!-- ... -->
</Class>
<!-- ... -->
<SourceLine classname="com.example.MyClass" start="5" end="5" sourcefile="MyClass.java"/>
</BugInstance>
密钥是<SourceLine classname="..."/>
,它会报告发现错误的行号。对于许多其他检查,包括未读字段和其他几个字节代码中没有行号的情况,此行正确填写,但不适用于UUF_UNUSED_FIELD
。因此,Hudson插件正在做出明智的事情并报告line = -1
。
没有修复,但希望澄清发生了什么。
答案 1 :(得分:0)
你几乎和-g在一起。 Findbugs基于字节码分析,并且取决于类文件中的调试信息,您的同事是正确的。
您还需要清除以前生成的任何类文件,因为编译器基于时间戳,并且不会重新生成最新的文件。