我有一个Java程序,该程序创建要在其上运行checkstyle的文件路径的列表。我很好奇,是否有一种方法可以直接从程序内部运行checkstyle,或者是否需要使用CLI。
答案 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。由您决定如何处理。