无法在spring内的java进程内运行pmd

无法在spring内的java进程内运行pmd,java,spring,spring-rest,pmd,static-code-analysis,Java,Spring,Spring Rest,Pmd,Static Code Analysis,我想在一个java进程(使用ProcessBuilder创建)内将pmd作为服务从spring中运行 public class PMDService { private ProcessBuilder processBuilder; private void createProcess() { processBuilder = new ProcessBuilder(); final Map<String, String> envMap = processBu

我想在一个java进程(使用ProcessBuilder创建)内将pmd作为服务从spring中运行

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();
  }


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

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

解决方案 让我们使用
ProcessBuilder.command(List命令)
方法

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

解决方案草案:

public List getProgramAndArguments(PMDParameters参数){
最终列表程序和参数=新建ArrayList();
添加(“cmd”);
程序和参数。添加(“/c”);
程序和参数。添加(“pmd”);
程序和参数。添加(“-d”);
add(params.getSourceCodePath());
程序和参数。添加(“-f”);
add(params.getOutputFormat());
程序和参数。添加(“-R”);
add(params.getResultSet());
程序和参数。添加(“>”);
add(params.getResultsPath());
返回程序和辩论;
}
public void runAnalyzer(PMDParameters params)引发IOException、InterruptedException{
createProcess();
命令(getProgramAndArguments(params));
最终流程=processBuilder.start();
process.waitFor();
}
此外,请通过提供正确的输入确保
params.getResultsPath()
具有正确的值:现在是

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

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

解决方案 让我们使用
ProcessBuilder.command(List命令)
方法

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

解决方案草案:

public List getProgramAndArguments(PMDParameters参数){
最终列表程序和参数=新建ArrayList();
添加(“cmd”);
程序和参数。添加(“/c”);
程序和参数。添加(“pmd”);
程序和参数。添加(“-d”);
add(params.getSourceCodePath());
程序和参数。添加(“-f”);
add(params.getOutputFormat());
程序和参数。添加(“-R”);
add(params.getResultSet());
程序和参数。添加(“>”);
add(params.getResultsPath());
返回程序和辩论;
}
public void runAnalyzer(PMDParameters params)引发IOException、InterruptedException{
createProcess();
命令(getProgramAndArguments(params));
最终流程=processBuilder.start();
process.waitFor();
}

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

我无法生成报告或找到它服务位于
src/main/java/com/gating/staticanalysis/service/PMDService中,我提供的结果路径是
“../../../../../../../../reports/pmd_report.xml“
其中报告是直接位于下面的文件夹application@pshreyasv,请慢慢调试实现。此外,尝试使用绝对路径检查当前实现是否正确。当然,您可以发布一个单独的问题来解决新问题。我无法生成报告或找到它。服务位于
src/main/java/com/gating/staticanalysis/service/PMDService
,我提供的结果路径为
。/../../../../../reports/pmd_report.xml”
其中报告是一个直接位于下面的文件夹application@pshreyasv,请慢慢调试实现。此外,尝试使用绝对路径检查当前实现是否正确。当然,您可以发布一个单独的问题来解决新问题。
{
   "sourceCodePath": "C:/bootcamp/Spring/springbootcode/springbootdemo",
    "resultsPath": ".",
    "outputFormat": "xml",
    "resultSet": "rulesets/java/quickstart.xml"
 }