标签: processbuilder

使用ProcessBuilder在Jar中运行可执行文件

我有一个我构建的应用程序,它使用通过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 jar execute processbuilder

2
推荐指数
1
解决办法
2315
查看次数

ProcessBuilder可以启动jar,但不会知道jar的参数

我试图在正在运行的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)

java processbuilder

2
推荐指数
1
解决办法
1382
查看次数

java.io.IOException:错误= 36,java中的文件名太长

我有一个使用 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 eclipse processbuilder

2
推荐指数
1
解决办法
1万
查看次数

处理流程流的正确方法

谁能澄清一下以下过程是否是处理进程流的正确方法,没有任何流缓冲区已满和阻塞问题

我正在从 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)

java stream processbuilder

2
推荐指数
1
解决办法
3802
查看次数

为什么我在 ProcessBuilder --Java 中收到 IllegalThreadStateException 错误?

此代码导致 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。我做错了什么,我该如何解决?

java process exit-code processbuilder

2
推荐指数
1
解决办法
366
查看次数

在shell脚本中设置环境变量并在Java程序中访问

这个问题是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 unix bash shell processbuilder

2
推荐指数
1
解决办法
2612
查看次数

使用processbuilder加载所有env变量

我想在从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解决问题,还是有更好的选择?

java bash processbuilder

2
推荐指数
1
解决办法
472
查看次数

无法捕获 groovy 执行的完整输出

我正在尝试列出 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 机器上运行。

io groovy process processbuilder

2
推荐指数
1
解决办法
2211
查看次数

ProcessBuilder和cmd

为什么

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启动但目录列表没有发生,这是为什么?

java cmd processbuilder

1
推荐指数
1
解决办法
3383
查看次数

如何使用一个Java程序来监视另一个Java程序的输出?

下面的图表显示了我正在尝试做的事情:它只是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)

java io multithreading processbuilder

1
推荐指数
1
解决办法
1585
查看次数

标签 统计

processbuilder ×10

java ×9

bash ×2

io ×2

process ×2

cmd ×1

eclipse ×1

execute ×1

exit-code ×1

groovy ×1

jar ×1

multithreading ×1

shell ×1

stream ×1

unix ×1