无法 运行 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()
具有正确的值:现在是 .
。
我想 运行 在 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()
具有正确的值:现在是 .
。