我需要执行一个执行另一个Java应用程序的批处理文件.我不关心它是否成功执行,我不必捕获任何错误.
是否可以使用ProcessBuilder执行此操作?如果我不捕获错误会有什么后果?
但是,我的要求只是执行另一个Java应用程序.
我正在尝试运行外部可执行文件,但显然它需要提升.代码是这样的,从使用ProcessBuilder的示例修改(因此具有一个参数的数组):
public static void main(String[] args) throws IOException {
File demo = new File("C:\\xyzwsdemo");
if(!demo.exists()) demo.mkdirs();
String[] command = {"C:\\fakepath\\bsdiff4.3-win32\\bspatch.exe"};
ProcessBuilder pb = new ProcessBuilder( command );
Process process = pb.start();
InputStream is = process.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String line;
System.out.printf("Output of running %s is:\n", Arrays.toString(command));
while ((line = br.readLine()) != null) {
System.out.println(line);
}
try {
int exitValue = process.waitFor();
System.out.println("\n\nExit Value is " + exitValue);
} catch (InterruptedException e) {
e.printStackTrace(); …Run Code Online (Sandbox Code Playgroud) 我想使用ProcessBuilder类通过我的Java Application顺序执行2个或更多命令.我尝试了其他响应/论坛中建议的多个选项,但没有运气.
以下是我尝试过的事情:
ProcessBuilder processBuilder = new ProcessBuilder("ls", ";", "pwd");
Run Code Online (Sandbox Code Playgroud)
给我以下错误:
错误:ls:;:没有这样的文件或目录错误:ls:pwd:没有这样的文件或目录
ProcessBuilder processBuilder = new ProcessBuilder("ls", "&&", "pwd");
Run Code Online (Sandbox Code Playgroud)
给我类似的错误:
错误:ls:&&:没有这样的文件或目录错误:ls:pwd:没有这样的文件或目录
List<String> command = new ArrayList<String>();
command.add("ls");
command.add(";");
command.add("pwd");
ProcessBuilder processBuilder = new ProcessBuilder(command);
Run Code Online (Sandbox Code Playgroud)
给我以下错误:
错误:ls:;:没有这样的文件或目录错误:ls:pwd:没有这样的文件或目录
我的操作系统是Linux/Mac-OSX.
哪一个更好?更好的意思是哪一个具有更好的安全性等(不易于使用).
我觉得extreemly酷使用标准语法像
import scala.sys.process._
val countLogger = ProcessLogger(line => {println ("out line: " + line)},
line => {println ("err line: " + line)})
val exitCode = ("cat prog.c" #&& "gcc prog.c -o prog -lm"
#&& "echo running, this may hang" #&& "prog.exe") ! countLogger
println("exitCode = " + exitCode)
Run Code Online (Sandbox Code Playgroud)
然而,最后一个进程会挂起.是否可以在超时时杀死它?
我正在尝试使用ProcessBuilder类通过Java启动外部进程,这很有用.目前正在使用命令运行:
new ProcessBuilder("java", "-jar", jarfile, args);
Run Code Online (Sandbox Code Playgroud)
我想做的就是这样,但要以低优先级开始这个过程.我的程序目前只在Windows上运行,因此我可以使用特定于窗口的解决方案.一些研究建议我使用"start"命令,但是当我尝试从Java执行此操作时,它会给出一个异常,说它是一个无法识别的命令(同样的命令可以从cmd.exe运行).
有没有人知道如何从Java启动进程(特定于Windows,如果需要),具有belownormal优先级?
我正在执行一个命令,它返回一个文件的修订号; '文件名'.但是如果执行命令时出现问题,则应用程序会挂起.我该怎么做才能避免这种情况?请在下面找到我的代码.
String cmd= "cmd /C si viewhistory --fields=revision --project="+fileName;
Process p = Runtime.getRuntime().exec(cmd) ;
BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line = null;
while ((line = in.readLine()) != null) {
System.out.println(line);
}
} catch (Exception e) {
e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud) 我有一个在OSGi/Equinox中运行的Java应用程序.从这个应用程序,我需要生成ProcessBuilder.start()在OSGi/Equinox中运行的Java子进程(例如via ),以便正确处理类加载.子流程需要多个捆绑包,所以我理想地喜欢在子流程'Equinox容器中安装这些捆绑包的一些相当动态的方法,例如通过读取feature.xml文件.
我已经阅读了这里的程序启动,但我没有看到Equinox如何适应它.我也看了成做一些像这样,但它不会是非常动态的,特别是当子进程的入口点束需要多个其他捆绑包,这需要进一步的束等
那么,如何以一种相当动态的方式将bundle加载到容器中来生成一个在OSGi/Equinox中运行的子进程?
注意:我需要使用单独的进程.子进程将使用使用全局变量的JNA本机库进行数据处理(我无法修改本机库).因此,为了能够同时处理不同的数据,数据处理需要在单独的进程中运行.
我正在寻找一种最有效的方法来决定:
众所周知,要从Java启动shell脚本,应该启动shell:
ProcessBuilder pb = new ProcessBuilder("/bin/sh", "script.sh", "arg1", "arg2);
Run Code Online (Sandbox Code Playgroud)
要启动二进制文件,应该启动二进制文件:
ProcessBuilder pb = new ProcessBuilder("/path/binary", "arg1", "arg2);
Run Code Online (Sandbox Code Playgroud)
如果使用shell执行二进制文件,则会产生错误:
ProcessBuilder pb = new ProcessBuilder("/bin/sh", "/path/binary", "arg1", "arg2);
(sh: cannot execute binary file)
Run Code Online (Sandbox Code Playgroud)
如果在没有shell二进制文件的情况下执行shell脚本,则会产生错误:
ProcessBuilder pb = new ProcessBuilder("script.sh", "arg1", "arg2);
(error 2: file not found)
Run Code Online (Sandbox Code Playgroud)
我的情况是我的应用程序不知道它的启动,二进制或脚本.
启动的应用程序是最终用户提供的事件处理程序.它很可能是在Unix下执行的shell脚本; 但它可以是Windows下的*.cmd,或者是在一些不起眼的平台下执行的Perl脚本.毕竟它是Java.
我的第一个天真的尝试是用shell启动命令行,看它是否有效.如果没有,请尝试将其作为二进制文件执行.
这是丑陋和冒险的:在平台和shell的一些未知组合下,第二次运行仍然可能仍然执行脚本,第二次,具有不可预测的结果.
此外,我无法判断脚本何时启动正常并且由于某些问题而失败,因为我无法启动它.
我现在正在考虑的最好的事情是:
如果您有任何更好的想法,请告知.
更新/部分解决方案
感谢所有与我分享他们想法的人.
事实证明,我把自己和互联网的其他部分弄糊涂了:)
在用户输入的命令行之前不需要在应用二进制文件前加前缀,前提是:
当我测试我的代码时,这些条件中的一个或另一个没有达到.:-(
从临时脚本执行测试后,脚本已经执行完毕.
第3点只能由用户完成,并且必须在用户手册中记录.
由于这些脚本传播到目标系统的方式,它们可能不可执行,可能不在PATH中.
我关心的唯一路径是相对路径,因此将./添加到任何相对路径就足够了.
使脚本在Unix(以及任何其他平台)下可执行是一个更大的挑战.这不是WORA.在它前面放置/ bin/sh可能会有所帮助,但如果我记得在Solaris下,shell将不会执行不可执行的脚本. …
我从Java(1.6)设置Linux环境有一个奇怪的问题; 特别是"PATH"变量.
简而言之,我有一个用于运行本机进程的管道,它使用java.lang.ProcessBuilder.用户可以选择通过HashMap命名设置环境变量environment:
ProcessBuilder pb = new ProcessBuilder(args);
Map<String, String> env = pb.environment();
if (environment != null)
env.putAll(environment);
Process process = pb.start();
Run Code Online (Sandbox Code Playgroud)
该env变量被设置正确,如果我把它转储到控制台,与PATH变量正确的值.但是,运行该进程会导致抛出Exception:
java.io.IOException: error=2, No such file or directory
在终端shell中使用相同的环境变量运行相同的进程.为了测试这个,我在终端后设置环境后运行Eclipse.在这种情况下,该ProcessBuilder过程正确运行.
所以必须发生的是,ProcessBuilder我没有使用我为它设置的环境,而是使用当前的系统环境.
我在网上找不到任何满意的答案.也许这是特定于操作系统的问题?还是别的我错过了什么?
processbuilder ×10
java ×9
runtime.exec ×2
eclipse-rcp ×1
elevation ×1
equinox ×1
exec ×1
osgi ×1
process ×1
scala ×1
shell ×1
windows ×1