【问题标题】:Excluding classes in Maven Checkstyle plugin reports在 Maven Checkstyle 插件报告中排除类
【发布时间】:2011-01-22 16:32:13
【问题描述】:

我有一个 Maven 2 项目,我想配置我的 Checkstyle 报告插件,以便只分析我的一些类。我找到了maven.checkstyle.excludes 属性,但尽管将它作为命令行参数传递(使用-D=maven.checkstyle.excludes=...),但我无法让它工作。我在插件文档页面上找不到任何内容。理想情况下,我希望能够在我的 POM 的<configuration> 部分中进行设置。

【问题讨论】:

    标签: java maven-2 checkstyle


    【解决方案1】:

    如果您像我一样来到这里寻找从 checkstyle 中排除生成的来源的方法,请执行以下操作:

    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-checkstyle-plugin</artifactId>
      <version>2.15</version>
      <configuration>
        <sourceDirectory>${project.build.sourceDirectory}</sourceDirectory>
      </configuration>
    </plugin>
    

    默认情况下,checkstyle 插件的checkstyle:checkstyle 目标使用${project.compileSourceRoots},这显然包括生成的源目录。

    如果将其更改为${project.build.sourceDirectory},它将仅使用源目录,而不使用任何生成的源目录。

    请注意,虽然 &lt;sourceDirectory&gt; 已被弃用,但替代方案 &lt;sourceDirectories&gt; 似乎不起作用。

    编辑:在 cmets 中,@Cyrusmith、@Ben 和 @Olivier Callioux 报告称,截至 2017 年,&lt;sourceDirectories&gt; 有效;我无法确认。

    【讨论】:

    • 非常感谢。排除生成的源真的让我很难过,我认为我使用了错误的模式。 sourceDirectories 不起作用是自 2.13 以来的一个已知错误 (issues.apache.org/jira/browse/MCHECKSTYLE-260)
    • 如上面对其他答案的评论中所述,这适用于生成的源,但不适用于生成的资源。 maven-checkstyle-plugin 没有resourceDirectory (resourceDirectories),所以如果你有其他的Maven 代码生成。或插件,或 build-helper-maven-plugin,然后完全排除 /target/ 最好的似乎是一个 SuppressionFilter,其 XML 包含 git.opendaylight.org/gerrit/#/c/48715 上的完整示例)
    • 对我来说这个配置是有效的:``` ${project.build.sourceDirectory}```
    • 这对我也有用(mvn 3.5.2,maven-checkstyle-plugin 2.17,checkstyle 8.7):${project.build.sourceDirectory}${project.build.testSourceDirectory}
    • 关于sourceDirectories的BUG自2017年起已修正,sourceDirectorydeprecated。请考虑更新您的答案。
    【解决方案2】:

    如果这个问题是关于 Maven 2 的,那么属性是 excludes 并采用逗号分隔的 Ant 模式列表。所以要么在命令行上传递这个:

    -Dexcludes=**/generated/**/*
    

    或者在插件配置中设置:

    <plugin>
       <groupId>org.apache.maven.plugins</groupId>
       <artifactId>maven-checkstyle-plugin</artifactId>
       <configuration>
           <excludes>**/generated/**/*</excludes>
       </configuration>
    </plugin>
    

    另一种选择是使用a suppression filter

    例如,您可以使用SuppressionCommentFilter抑制包含CHECKSTYLE:OFF 的评论和包含CHECKSTYLE:ON 的评论之间的审计事件(然后只需将这些 cmets 添加到您不想检查的代码)。

    【讨论】:

    • 你可能想禁用插件,也许?
    • 这不起作用。 &lt;excludes&gt; 路径模式不适用于基目录,generated 目录是其中的一部分。
    • 好吧,就这样吧。通常,generated 目录是基本目录的一部分,因此,在其上使用&lt;excludes&gt; 将不起作用。但是,如果您碰巧有包含 generated 包的源代码,那么它会。
    • 这样做的问题是它不起作用,例如对于 /target/ - 我认为是因为在源或资源的相对而非绝对路径上检查了排除。为了完全排除任何生成的代码,而不依赖任何包约定,${project.build.sourceDirectory} 因此是唯一的解决方案。要完全排除资源,带有包含 的 XML 的 SuppressionFilter 似乎是唯一的方法(git.opendaylight.org/gerrit/#/c/48715 上的完整示例)跨度>
    • 我来到这里已经筋疲力尽,正在寻找一种方法来排除多模块构建的整个模块。不要为此尝试 ,因为它似乎适用于其模块中每个文件的相对路径(因此不包含模块名称)。幸运的是,抑制过滤器方法有效:
    【解决方案3】:

    另外,如果你想排除多个个独立的文件夹,你可以添加多个独立的路径,这样用逗号分隔

    <excludes>org/log4j/*,com/acme/**/*,com/companyb/*</excludes>
    

    【讨论】:

      【解决方案4】:

      上面的答案对我不起作用,因为我在 maven 中运行代码生成,它还将目标/生成的目标添加为源目录。

      以下解决方案有效: 您必须使用明确的 checkstyle-suppressions.xml 配置文件并从您的配置中激活它:

      <plugins>
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-checkstyle-plugin</artifactId>
          <version>3.1.1</version>
          <configuration>
            <configLocation>checkstyle.xml</configLocation>
            <suppressionsLocation>checkstyle-suppressions.xml</suppressionsLocation>
         [...]
      

      排除目标文件夹的抑制文件如下所示:

      <?xml version="1.0"?>
      <!DOCTYPE suppressions PUBLIC
        "-//Checkstyle//DTD SuppressionFilter Configuration 1.2//EN"
        "https://checkstyle.org/dtds/suppressions_1_2.dtd">
      
      <suppressions>
        <suppress files="[/\\]target[/\\]" checks=".*" />
      </suppressions>
      

      【讨论】:

        猜你喜欢
        • 2016-03-09
        • 2016-10-15
        • 1970-01-01
        • 1970-01-01
        • 2014-10-15
        • 2011-04-28
        • 2018-01-29
        • 1970-01-01
        • 2011-07-01
        相关资源
        最近更新 更多