我正在尝试运行流程构建器来执行我的java项目的 bin / resources / 文件夹中的文件。为此,我不想对完整路径进行硬编码,因此我尝试使用类加载器传递绝对路径(我的意思是完整路径)并将此值作为列表参数传递给ProcessBuilder类。我怎么也没能成功。
下面的代码示例(案例1和案例2)运行良好,但最终没有任何事情发生。我的意思是文件没有被调用。
案例1:
String rCmd = "Rscript.exe";
String rScriptName = "resources/MyScript.R";
List list = new ArrayList<>();
list.add(rCmd);
list.add(this.getClass().getClassLoader().getResource(rScriptName).toURI().toString());
ProcessBuilder pb = new ProcessBuilder(list);
pb.start();
案例2:
String rCmd = "Rscript.exe";
String rScriptName = "resources/MyScript.R";
List list = new ArrayList<>();
list.add(rCmd);
list.add(this.getClass().getClassLoader().getResource(rScriptName).toString());
ProcessBuilder pb = new ProcessBuilder(list);
pb.start();
下面的代码抛出异常:
案例3:
String rCmd = "Rscript.exe";
String rScriptName = "resources/MyScript.R";
List list = new ArrayList<>();
list.add(rCmd);
list.add(this.getClass().getClassLoader().getResource(rScriptName).toURI());
ProcessBuilder pb = new ProcessBuilder(list);
pb.start();
案例4:
File file = new File(this.getClass().getClassLoader().getResource(rScriptName).toURI());
List list = new ArrayList<>();
list.add(rCmd);
list.add(file);
ProcessBuilder pb = new ProcessBuilder(list);
pb.start();
输出:
Exception in thread "main" java.lang.ArrayStoreException
at java.lang.System.arraycopy(Native Method)
at java.util.ArrayList.toArray(ArrayList.java:361)
at java.lang.ProcessBuilder.start(ProcessBuilder.java:1005)
下面的代码给出了我预期的输出但不想这样硬编码路径,因为我需要稍后在linux框中运行这段代码。
String rCmd = "Rscript.exe";
String rScriptName = "D:/MyScript.R";
ProcessBuilder pb = new ProcessBuilder(rCmd, rScriptName);
pb.start();
期待你需要的帮助!
答案 0 :(得分:1)
String rCmd = "Rscript.exe";
String rScriptName = "filename Without Resource";
List list = new ArrayList<>();
list.add(rCmd);
list.add([Class name].class.getClassLoader().getResource(rScriptName).toURI().getPath());
正在工作。
进程构建器Expect String Argument因此尝试解析列表,除非它们是字符串,否则它将提供以下异常。
尝试 this.class.getClassLoader()。的getResource(rScriptName).toURI()。的getPath()
它将添加文件的绝对路径,并将执行。