我有一个我构建的应用程序,它使用通过ProcessBuilder调用的非Java可执行文件:
ProcessBuilder pb = new ProcessBuilder(invocation);
pb.redirectErrorStream(true);
Process proc = pb.start();
InputStream is = proc.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
但是,我想将该应用程序整齐地捆绑到jar文件本身,而不是要求将它放在同一目录之外.有没有办法运行这个应用程序而不提取它?
如果我需要删除ProcessBuilder,那就没关系,只要它能正常工作.:)
我试图在正在运行的java程序中运行jmol的jar.这是我在命令行中运行它的方式,它运行正常.
$ java -jar Jmol.jar 1644_____.pdb -o -J "measure 3 4;measure 1 2"
Run Code Online (Sandbox Code Playgroud)
我正在使用ProcessBuilder,它正确调用jar文件和第一个参数,但没有正确调用.我错过了什么?
import java.io.IOException;
class test{
public static void main(String [] ar) throws Exception{
run();
}
public static void run() throws IOException, InterruptedException{
String INPUTPDB = "1644_____.pdb";
String args[] = {"java", "-jar", "Jmol.jar", INPUTPDB, "-o", "-J", "\"measure 3 4;measure1 2\""};
ProcessBuilder pb = new ProcessBuilder(args);
//Runtime.getRuntime().exec(args);
Process p = pb.start();
p.waitFor();
}
}
Run Code Online (Sandbox Code Playgroud) 我有一个使用 ProcessBuilder API 执行 linux shell 命令的方法。但是,当我尝试执行从 eclipse 创建的 Runnable Jar 时,它给出了如下错误。我浏览了很多博客和帖子,但无法解决该问题。
我使用的是java 1.7
XARGS 命令给我以下信息
xargs --show-limits
Your environment variables take up 3064 bytes
POSIX upper limit on argument length (this system): 2616328
POSIX smallest allowable upper limit on argument length (all systems): 4096
Maximum length of command we could actually use: 2613264
Size of command buffer we are actually using: 131072
List<String> list = getList();
for(Iterator<String> itr = list.iterator();itr.hasNext();)
{
String command = itr.next();
System.out.println("Length of String "+command.length()); …Run Code Online (Sandbox Code Playgroud) 谁能澄清一下以下过程是否是处理进程流的正确方法,没有任何流缓冲区已满和阻塞问题
我正在从 java 程序调用外部程序,我正在使用 ProcessBuilder 来构建流程,并在执行后
Process gpgProcess = processBuilder.start();
Run Code Online (Sandbox Code Playgroud)
我正在使用一种方法来处理该过程
String executionResult = verifyExecution(gpgProcess);
Run Code Online (Sandbox Code Playgroud)
在我的方法中,我试图处理流程
private String verifyExecution(Process gpgProcess) throws IOException, InterruptedException {
String gpgResult = null;
BufferedReader stdOut = new BufferedReader(new InputStreamReader(gpgProcess.getInputStream()));
BufferedReader stdErr = new BufferedReader(new InputStreamReader(gpgProcess.getErrorStream()));
gpgProcess.waitFor();
if(stdErr.ready()) {
gpgResult = "Exit code: " + gpgProcess.exitValue() + "\n" + readStream(stdErr);
} else if(stdOut.ready()) {
gpgResult = "Exit code: " + gpgProcess.exitValue() + "\n" + readStream(stdOut);
} else {
gpgResult = "Exit code: " + gpgProcess.exitValue();
} …Run Code Online (Sandbox Code Playgroud) 此代码导致 IllegalThreadStateException 运行时错误来自 if 语句:
public static void main(String args[]) throws IOException, InterruptedException {
Runtime runtime = Runtime.getRuntime();
Process proc = new ProcessBuilder("\"c:\\[directory]/doer.exe\"").start();
if(proc.exitValue() == 1)
System.out.println("Output: 1");
}
Run Code Online (Sandbox Code Playgroud)
应该专门运行的可执行文件具有退出代码 1。我做错了什么,我该如何解决?
这个问题是Setenvironmentvariablesinshellscript/accessinJavaprogram的后续问题。我试图在运行 shell 脚本后获取 Java 中的环境变量,但无法执行此操作
Shell 脚本:getDetails.sh:
#!/bin/bash
# File: getDetails.sh
export userDetails="USER123"
# echo "User Details for App :$userDetails"
Run Code Online (Sandbox Code Playgroud)
Java方法:
String details = new String("source " + "getDetails.sh");
ProcessBuilder processBuilder = new ProcessBuilder("/bin/bash", "-c", details);
Process getPwdProc = processBuilder.start();
System.out.println("Details - " + processBuilder.environment().get("userDetails"));
Run Code Online (Sandbox Code Playgroud)
java 方法为环境变量 userDetails 返回/打印 null。
PS - 请注意,此处不可能使用 InputStream/BufferedReader 读取用户详细信息,因为程序/组织不允许回显详细信息。
我想在从java代码执行脚本之前加载我在.bashrc文件中定义的变量.该脚本通过ProcessBuilder执行.在网络上,我看到命令数组应该bash -c如下所示:
String[] cmdline = {"/bin/bash", "-c", "python", "/home/mahmood/temp.py"};
final ProcessBuilder pb = new ProcessBuilder(cmdline);
pb.command(cmdline);
pb.redirectOutput(Redirect.INHERIT);
final Process p = pb.start();
int exitCode = p.waitFor();
if (exitCode != 0) {
throw new IOException("... python failed :( \n");
}
Run Code Online (Sandbox Code Playgroud)
确实,waitFor永远不会回来!如果我删除了bash -c,那么exitCode由于没有加载变量,因此将为非零.
请注意.bashrc中没有单个变量.我可以使用ProcessBuilder解决问题,还是有更好的选择?
我正在尝试列出 svn 文件夹的内容,其中包含大约 1200 个项目。沿着“在 groovy 脚本中执行外部程序并捕获输出”中的内容,我开发了以下代码
def svnCommand = "svn list ${repoUrl}"
def sout = new StringBuilder()
def serr = new StringBuilder()
Process sproc = svnCommand.execute()
sproc.consumeProcessOutput(sout, serr)
sproc.waitForProcessOutput()
println sout
Run Code Online (Sandbox Code Playgroud)
如果我要运行此脚本,无论我将初始容量设置多高,我总是会得到截断的输出。输出明显被截断,如以下摘录所示
...
SS0D76I0.cpy
SS0D76M0.cpy
SS0D76N0.cpy
SS
Run Code Online (Sandbox Code Playgroud)
关于捕获命令的完整输出有什么建议吗?该脚本在 Windows 机器上运行。
为什么
ProcessBuilder pb = new ProcessBuilder("cmd","/C","dir");
Run Code Online (Sandbox Code Playgroud)
工作但是
ProcessBuilder pb = new ProcessBuilder("cmd","dir");
Run Code Online (Sandbox Code Playgroud)
才不是。
我的意思是在后一种情况下cmd启动但目录列表没有发生,这是为什么?
下面的图表显示了我正在尝试做的事情:它只是2个程序.一个是一个简单的Child程序,它每2秒逐行写出整数.
另一个是Parent监视日志文件的程序(只是一个非常基本的文本文件).如果日志文件在5秒内没有被修改,那么它应该重启 Child程序(通过批处理文件); 然后继续正常.
我的子类代码在这里:
package fileiotestapplication;
import java.io.*;
import java.io.IOException;
import java.util.*;
public class WriterClass {
@SuppressWarnings("oracle.jdeveloper.java.insufficient-catch-block")
public WriterClass() {
super();
int[] content = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,};
String[] friends = {"bob",};
File file = new File("/C:/Java_Scratch/someFile.txt");
// if file does not exists, then create it
try {
if (!file.exists()) {
file.createNewFile();
}
for (int i = 0 ; i < content.length; i++) …Run Code Online (Sandbox Code Playgroud)