如何从 checkstyle 插件检查中排除 module-info.java?

Posted

技术标签:

【中文标题】如何从 checkstyle 插件检查中排除 module-info.java?【英文标题】:How to exclude module-info.java from checkstyle plugin checks? 【发布时间】:2018-03-11 18:10:45 【问题描述】:

module-info.java 文件添加到我的项目后,我的 checkstyle 插件开始失败:

[ERROR] 未能执行目标 org.apache.maven.plugins:maven-checkstyle-plugin:2.17:check 项目电子邮件上的(默认 cli):在 checkstyle 期间失败 配置:分析过程中发生NoViableAltException 文件 /home/xxx/IdeaProjects/blynk-server/server/notifications/email/src/main/java/module-info.java。 意外令牌:模块 -> [帮助 1]

我试过了

<module name="BeforeExecutionExclusionFileFilter">
    <property name="fileNamePattern" value="module\-info\.java$"/>
</module>

但是,它失败了:

[ERROR] 未能执行目标 org.apache.maven.plugins:maven-checkstyle-plugin:2.17:check 项目 blynk 上的 (default-cli):在 checkstyle 期间失败 配置:无法初始化模块 BeforeExecutionExclusionFileFilter - 无法实例化 'BeforeExecutionExclusionFileFilter' 类,也不可能 将其实例化为 com.puppycrawl.tools.checkstyle.checks.annotation.BeforeExecutionExclusionFileFilter

在 maven-checkstyle-plugin 的 checkstyle 期间跳过 module-info.java 文件的正确方法是什么?

【问题讨论】:

【参考方案1】:

不确定 Checkstyle 过滤器为什么不起作用(这个 reported bug 看起来和你的很相似,它在 7.3.0 版中已修复,所以也许你需要更新 Checkstyle)。

无论如何,Maven excludes 元素也应该这样做:

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

plugin goal 文档中的更多信息。

【讨论】:

理想情况下,checkstyle 插件应该不会为module-info.java 抛出异常,不是吗? @nullpointer 是的。但我不知道他们是否已经支持它。我从他们的文档中找到了this page,这表明它无法读取该文件。 你似乎正在朝着这个方向进行一些工作。我试过detailing it as well。【参考方案2】:

BeforeExecutionExclusionFileFilter 在 Checkstyle 7.2 中添加。

maven-checkstyle-plugin 3.0.0 版(这是截至 2018-04-01 的最新版本)默认使用 Checkstyle 6.18。

“Checkstyle”和“Checkstyle Maven Plugin”是不同的东西,有不同的发布周期。

你可能想upgrade the Checkstyle version如下:

<plugin>
  <artifactId>maven-checkstyle-plugin</artifactId>
  <version>3.0.0</version> <!-- Checkstyle Plugin version -->

  <!-- ... Configuration, Executions ... -->

  <dependencies>
    <dependency>
      <groupId>com.puppycrawl.tools</groupId>
      <artifactId>checkstyle</artifactId>
      <version>8.8</version> <!-- Checkstyle version -->
    </dependency>
  </dependencies>
</plugin>

之后,BeforeExecutionExclusionFileFilter 以及其他较新的 Checkstyle 功能(例如新检查)将被识别。

【讨论】:

【参考方案3】:

虽然这不可能作为答案。然而太长了,无法发表评论,只是为了记下maven-checkstyle-plugin 所在的轨道:-

last release 的版本 2.17 于 2015 年 10 月 15 日发布,几乎是 2 年前的版本。 当前的 maven-plugins 主干指向该插件在其3.0.0-SNAPSHOT 版本中正在进行的工作,这可能意味着我们很快可以期待在不久的将来某个时候出现org.apache.maven.plugins:maven-checkstyle-plugin:3.0.0,并将module-info.java 理解为一个类. 这与Java+9+-+Jigsaw 文档不一致,该文档指定了正在升级以支持 JDK-9 的模块和插件列表。

【讨论】:

我认为这与 Maven 插件无关。该插件在内部委托给 Checkstyle。支持 module-info.java 可能应该在 Checkstyle 方面完成,而不是 Maven(这解释了您关于升级 wiki 中缺少对插件的引用的第三点)。 @manouti 我试图提出的一点是插件更新可能内置了 checkstyle 支持。

以上是关于如何从 checkstyle 插件检查中排除 module-info.java?的主要内容,如果未能解决你的问题,请参考以下文章

CheckStyle

Java代码规范和质量检查插件-Checkstyle(官方资源)

maven配置checkstyle插件对代码规范进行静态检查

CheckStyle插件安装及说明

如何配置eclipse的checkstyle和findbugs两个插件

Eclipse提高开发速度-插件篇Checkstyle的使用