是否可以通过Java程序调用Checkstyle?

时间:2019-05-01 16:52:49

标签: java checkstyle

我有一个Java程序,该程序创建要在其上运行checkstyle的文件路径的列表。我很好奇,是否有一种方法可以直接从程序内部运行checkstyle,或者是否需要使用CLI。

2 个答案:

答案 0 :(得分:2)

是的,这是可能的,尽管它不是一个文档化的API,而是一组有效的调用,并且保持相当稳定。实际上,IDE插件就是这样。

例如,用于IntelliJ的Checkstyle插件提供了一些代码,您可以查看这些代码以了解想法:
https://github.com/jshiell/checkstyle-idea/tree/5.26.0/src/csaccess/java/org/infernus/idea/checkstyle/service/cmd

但是,将Checkstyle作为命令行程序(例如,通过zt-exec进行调用)并解析其XML报告可能会更容易。也就是说,如果您不需要通过正在进行中的AuditListeners提供直接反馈。

答案 1 :(得分:0)

  

我有一个Java程序
  是从我的程序中直接运行Checkstyle的一种方法

您可以从另一个Java程序中调用任何Java程序。从命令行调用Java程序时,将调用main方法,该方法将传递java程序本身不使用的所有命令行参数。您在Java程序中需要做的就是调用与命令行调用相同的main。对于Checkstyle,这是com.puppycrawl.tools.checkstyle.Main。参见https://github.com/checkstyle/checkstyle/blob/bd7621fae3b1b887d46b8a678600db7e6d03185c/src/main/java/com/puppycrawl/tools/checkstyle/Main.java#L100

然而,checkstyle的缺点是它会在完成后调用System.exit,因此您永远不会从调用中返回。为防止System.exit完全终止JVM,请参阅Java: How to test methods that call System.exit()?中的SecurityManager示例。

您可以避免所有这些System.exit事务,但是这将需要您复制一堆Checkstyle的代码,这些代码也在Main类中。参见https://github.com/checkstyle/checkstyle/blob/bd7621fae3b1b887d46b8a678600db7e6d03185c/src/main/java/com/puppycrawl/tools/checkstyle/Main.java#L332。由您决定如何处理。