checkstyle +抑制滤镜

时间:2008-10-13 16:51:06

标签: java code-analysis static-analysis checkstyle

我有一个checkstyle抑制滤镜设置(例如,忽略单位测试代码中的幻数)。

suppress xml文件与checkstyle xml文件位于同一文件夹中。但是,此文件实际上有所不同: 在我的Windows开发框中,它位于d:\ dev \ shared \ checkstyle \ config中 在Linux CI服务器上,它将位于/ root / repo / shared / checkstyle / config中 在另一个开发人员的盒子里,它可以在任何地方(他们检查他们的svn回购)。

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

任何帮助?

6 个答案:

答案 0 :(得分:10)

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

基本上,我通过使用Ant构建脚本配置Checkstyle属性文件,将正确的,特定于平台的目录值注入主Checkstyle配置文件。

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

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

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

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

My 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的价值来自哪里?好吧,它是从我的构建属性派生,继续阅读。您需要使用您提到的目录值指定这样的值。

请注意,在指定此目录的方式方面存在一个稍微不明显的问题。我说scm.dir.unix值是从构建属性派生的,因为我发现主Checkstyle配置文件不能包含反斜杠,即Windows路径分隔符,在{file属性的值SuppressionFilter 1}}模块。例如,指定C:\foo\bar\baz之类的内容会导致出现Checkstyle错误消息,指出无法找到C:foobarbaz。我通过使用Ant scm.dir任务将pathconvert目录构建属性“转换”为“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文件中包含的键/值对注入主Checkstyle配置。

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

希望这有帮助

答案 1 :(得分:6)

在eclipse中,我提出以下内容,不需要我添加任何其他属性:

<module name="SuppressionFilter">
    <property name="file" value="${samedir}/suppressions.xml"/>
</module>

答案 2 :(得分:2)

我使用build.xml变量和项目名称获取ant.file所在目录的绝对路径:

<project name="common" ... >
  <dirname property="thisdir" file="${ant.file.common}"/>

然后我可以连接到checkstyle配置文件的绝对路径:

checkstyle.suppressions.file=${thisdir}/qclib/checkstyle-suppressions.xml

由于thisdir变量来自ant,因此似乎不需要路径分隔符转换。

答案 3 :(得分:2)

如果您正在使用eclipse,并且您将抑制文件与外部checkstyle配置放在同一目录中,则可以设置如下的抑制过滤器:

<module name="SuppressionFilter">
    <property name="file" value="${config_dir}/my_suppressions.xml"/>
</module>

您还必须在checkstyle配置中定义$ {config_dir}属性:

Eclipse首选项 - &gt; “Checkstyle” - &gt;选择你的cs配置 - &gt; “属性......” - &gt; “其他属性......”

为checkstyle配置目录定义属性:

config_dir --->  ${config_loc}

答案 4 :(得分:1)

我认为罗伯特的答案可以扩展到 ant和Eclipse 的简单解决方案:

在您的配置XML中包含抑制文件,如下所示:

<module name="SuppressionFilter">
    <property name="file" value="${samedir}/suppressions.xml"/>
</module>

现在,Eclipse很满意并找到了该文件。

要让ant工作,请将目标更新为:

<checkstyle config="${checkstyle.config}/checkstyle-checks.xml">
    <!-- ... -->
    <property key="samedir" value="${checkstyle.config}"/>
</checkstyle>

希望这有帮助。

答案 5 :(得分:0)

自CheckStyle 4.26.0起,您可以在配置文件中使用预定义的常量。

https://github.com/jshiell/checkstyle-idea/issues/217):

  
      
  • $ {basedir}和$ {project_loc}-映射到当前项目目录
  •   
  • $ {workspace_loc}-映射到当前的Eclipse工作区目录
  •   
  • $ {config_loc}和$ {samedir}-映射到配置文件所在的目录
  •   

如果要与maven共享配置,则需要使用“ propertyExpansion”配置元素在“ POM配置”(在报告部分中)“别名”“ eclipse常量”:

ID     name     state      mid
12345   JOHN    AZ        ee/ff (ONLY ONE)
45678   henry   AL        ll/mm (ONLY ONE)

“ propertyExpansion”的灵感来自https://github.com/checkstyle/checkstyle/blob/master/pom.xml#L582