有没有办法从 Java 程序中调用 checkstyle?

Is there a way to call checkstyle from within a Java program?

我有一个 Java 程序,它创建了一个我想要 运行 checkstyle 的文件路径列表。我很好奇是否有办法从我的程序中直接 运行 checkstyle,或者我是否需要 shell 输出到 CLI。

是的,这是可能的,虽然它不是一个有记录的 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, for example) and parse its XML report. That is if you don't need to have the direct feedback provided via in-process AuditListeners

I have a Java program
is a way to directly run checkstyle from within my program

您可以从另一个 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,因此您永远不会 return 从您的调用。要防止 System.exit 完全终止 JVM,请参阅 Java: How to test methods that call System.exit()? 的 SecurityManager 示例。

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