java - checkstyle + 抑制过滤器

标签 java code-analysis static-analysis checkstyle

我有一个 checkstyle 抑制过滤器设置(例如,忽略单元测试代码中的魔数(Magic Number))。

抑制 xml 文件与 checkstyle xml 文件位于同一文件夹中。但是,此文件实际所在的位置各不相同: 在我的 Windows 开发箱中,它位于 d:\dev\shared\checkstyle\config 在 Linux CI 服务器上,它将位于/root/repo/shared/checkstyle/config 在另一个开发者盒子上,它可以在任何地方(他们检查他们的 svn 仓库)。

唯一“一致”的是抑制文件始终与 checkstyle xml 文件位于同一文件夹中。 我无法弄清楚如何确保始终始终如一地提取此文件。另外我不知道为什么 checkstyle 不支持在 checkstyle xml 文件中嵌入抑制。

有什么帮助吗?

最佳答案

当我在 Linux 和 Windows 之间来回切换时,我在 Checkstyle 抑制配置方面遇到了同样的问题。以下是我在基于 Ant 的构建系统中解决它的方法:

基本上,我通过使用 Ant 构建脚本配置 Checkstyle 属性文件,将适当的、特定于平台的目录值注入(inject)到主 Checkstyle 配置文件中。

我的主要 Checkstyle 配置文件有一个 SuppressionFilter 模块声明,如下所示。 checkstyle-suppressions-file 属性的值来自 Checkstyle 属性文件:

<module name="SuppressionFilter">
    <property name="file" value="${checkstyle-suppressions-file}"/>
</module>

Checkstyle 属性文件不是静态的,它是由 Ant 构建脚本从名为 template-checkstyle.properties 的属性文件模板生成的。以下是抑制文件属性的模板:

checkstyle-suppressions-file=@SCM_DIR@/checkstyle_suppressions.xml

我的 Ant 构建脚本将此文件复制到名为 checkstyle.properties 的文件中。该副本将特殊标记替换为抑制文件所在目录的正确值:

<copy file="${scm.dir}/template-checkstyle.properties" tofile="${scm.dir}/checkstyle.properties">
    <filterset>
        <filter token="SCM_DIR" value="${scm.dir.unix}"/>
    </filterset>
</copy>

现在,scm.dir.unix 的值从何而来?好吧,它是 派生 来 self 构建的一个属性,请继续阅读。您需要使用您提到的目录值指定这样的值。

请注意,关于您指定此目录的方式,有一个不太明显的问题。我说 scm.dir.unix 值是从构建属性派生的,因为我观察到主 Checkstyle 配置文件不能在 的值中包含反斜杠,即 Windows 路径分隔符SuppressionFilter 模块的 file 属性。例如,指定类似 C:\foo\bar\baz 的内容会导致 Checkstyle 错误消息指出无法找到 C:foobarbaz。我通过使用 Ant 的 pathconvert 任务将 scm.dir 目录构建属性“转换”为“unix”格式来解决此问题:

<pathconvert targetos="unix" property="scm.dir.unix">
    <path location="${scm.dir}"/>
</pathconvert>

然后我这样调用 checkstyle Ant 任务:

<checkstyle config="${scm.dir}/checkstyle_checks.xml"
            properties="${scm.dir}/checkstyle.properties">
    <!-- details elided -->
</checkstyle>

调用 checkstyle 任务会将 checkstyle.properties 文件中包含的键/值对注入(inject)主 Checkstyle 配置。

如果你愿意,你可以看到完整的脚本here

希望对你有帮助

关于java - checkstyle + 抑制过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/198244/

相关文章:

java - 我的应用程序运行完美,但现在总是崩溃

java - 如何在不定义主键字段的情况下使用实体管理器插入记录?

delphi - Delphi 4的代码分析工具

c++ - 哪个工具可以列出对 C 中特定变量的写入访问权限?

c++ - 为什么 Cppcheck 没有发现这个明显的数组越界错误呢?

c# - 静态代码分析——首先打开哪些?

Erlang 透析器 创造的乐趣没有本地返回

static-analysis - 如何学习静态分析?

java - ClassLoad 一个 Enum 类型

java - 如果车辆可用则返回信息