无法在spring内的java进程内运行pmd
我想在一个java进程(使用ProcessBuilder创建)内将pmd作为服务从spring中运行无法在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
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"
}