无法 运行 pmd inside java process inside spring

Unable to run pmd inside java process inside spring

我想 运行 在 java 进程(使用 ProcessBuilder 创建)中从 spring 作为服务进行 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": "Cannot run program \"cmd /c pmd -d C:/bootcamp/Spring/springbootcode/springbootdemo -f xml -R rulesets/java/quickstart.xml > .\": CreateProcess error=2, The system cannot find the file specified","

在postman中输入json

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

分析

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

但事实并非如此:相反,程序及其参数应该单独传递。

解决方案

让我们使用ProcessBuilder ProcessBuilder.command(List<String> 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() 具有正确的值:现在是 .