【问题标题】:Unable to run pmd inside java process inside spring无法在spring的java进程中运行pmd
【发布时间】:2019-08-16 05:06:13
【问题描述】:

我想在 spring 中的 java 进程(使用 ProcessBuilder 创建)中运行 pmd 作为服务。

public class PMDService {

  private ProcessBuilder processBuilder;

  private void createProcess() {
    processBuilder = new ProcessBuilder();
    final Map<String, String> envMap = processBuilder.environment();
    String path = envMap.get("Path");
    path += "../../../../../../../static-code-analyzers/pmd/bin;";
    envMap.put("Path", path);
  }


  public String getCommand(PMDParameters params) {
    final StringJoiner command = new StringJoiner(" ");
    command.add("cmd")
    .add("/c")
    .add("pmd")
    .add("-d")
    .add(params.getSourceCodePath())
    .add("-f")
    .add(params.getOutputFormat())
    .add("-R")
    .add(params.getResultSet())
    .add(">")
    .add(params.getResultsPath());

    return command.toString();
  }


  public void runAnalyzer(PMDParameters params) throws IOException, InterruptedException {
    createProcess();
    processBuilder.command(getCommand(params));
    final Process process = processBuilder.start();
    process.waitFor();
  }


当我使用邮递员测试其余端点时,出现以下错误:

""message": "无法运行程序\"cmd /c pmd -d C:/bootcamp/Spring/springbootcode/springbootdemo -f xml -R rulesets/java/quickstart.xml > .\": CreateProcess error=2, 系统 找不到指定的文件","

在邮递员中输入json

{
   "sourceCodePath": "C:/bootcamp/Spring/springbootcode/springbootdemo",
    "resultsPath": ".",
    "outputFormat": "xml",
    "resultSet": "rulesets/java/quickstart.xml"
 }

【问题讨论】:

    标签: java spring spring-rest pmd static-code-analysis


    【解决方案1】:

    分析

    在提供的代码段中,程序及其参数作为单个字符串值作为ProcessBuilder ProcessBuilder.command(String... command)方法参数传递。

    但这不应该是这样:相反,程序及其参数应该分开传递。

    解决方案

    让我们使用ProcessBuilder ProcessBuilder.command(List&lt;String&gt; command) 方法。

    我们将适当地准备字符串列表:它将包含程序及其参数。

    解决方案草案:

    public List<String> getProgramAndArguments(PMDParameters params) {
        final List<String> programAndArguments = new ArrayList<String>();
        programAndArguments.add("cmd");
        programAndArguments.add("/c");
        programAndArguments.add("pmd");
        programAndArguments.add("-d");
        programAndArguments.add(params.getSourceCodePath());
        programAndArguments.add("-f");
        programAndArguments.add(params.getOutputFormat());
        programAndArguments.add("-R");
        programAndArguments.add(params.getResultSet());
        programAndArguments.add(">");
        programAndArguments.add(params.getResultsPath());
        return programAndArguments;
    }
    
    public void runAnalyzer(PMDParameters params) throws IOException, InterruptedException {
        createProcess();
        processBuilder.command(getProgramAndArguments(params));
        final Process process = processBuilder.start();
        process.waitFor();
    }
    

    另外,请通过提供正确的输入确保params.getResultsPath() 具有正确的值:现在是.

    【讨论】:

    • 我无法生成报告或找到它,服务位于src/main/java/com/gating/staticanalysis/service/PMDService,我提供的resulPaths 是"../../../../../../../reports/pmd_report.xml",其中报告是应用程序下的文件夹
    • @pshreyasv,请花点时间调试实现。此外,尝试使用绝对路径来检查当前实现是否正确。当然,您可以发布一个单独的问题来解决新问题。
    猜你喜欢
    • 1970-01-01
    • 2021-09-17
    • 1970-01-01
    • 1970-01-01
    • 2018-11-07
    • 2015-03-03
    • 1970-01-01
    • 2021-01-17
    • 1970-01-01
    相关资源
    最近更新 更多