java - 从 jar 运行 shell 命令?

标签 java shell jar executable-jar

从 java 调用 shell 命令的通常方法是这样的:

Process process = Runtime.getRuntime().exec(command);

并且通常工作正常。 但现在我已将项目导出到可执行 jar 文件,并且 callig shell 命令不再起作用。此问题有任何解释、解决方案或解决方法吗?

菲尼亚斯

--

编辑:

  • 甚至无法识别键盘中断(ctrl+c;ctrl+d)。

  • 杀死java后终端输入将不起作用

--

最小的程序:

import java.io.BufferedWriter;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.IOException;

public class Test {
    public static String fileName = "";

    /** test if you can open a 7z archive file with a given password */
    public static boolean test(String password)
        throws IOException, InterruptedException {
        String command = "7z l "+fileName;

        Process process = Runtime.getRuntime().exec(command);

        OutputStream out = process.getOutputStream();
        OutputStreamWriter w = new OutputStreamWriter(out);
        BufferedWriter writer = new BufferedWriter(w);
        writer.write(password+"\n");
        writer.close();
        w.close();
        out.close();

        if(process.waitFor() == 0) {
            return true;
        }
        else {
            return false;
        }
    }

    public static void main(String[] args) throws IOException, InterruptedException {
        fileName = args[0];
        test(args[1]);
    }
}

最佳答案

如果您运行测试程序并使用 ps 或任务管理器,您会注意到 7z 正在运行。您的问题是您没有消耗流程的输出。因此,7z 试图输出存档内容时很快就会被阻止。

如果您在 process.waitFor() 之前添加以下几行,您将获得一个工作程序:

    InputStream in = process.getInputStream();
    byte[] buf = new byte[256];
    while (true) {
        int c = in.read(buf);
        if (c == -1)
            break;
        System.out.println(new String(buf));
    }

但是,这只会消耗进程标准输出,您需要使用 process.getErrorStream() 执行相同的操作。您可能会发现使用 ProcessBuilder 来启动进程更容易,因为它允许您合并 stderr 和 stdout 流。

关于java - 从 jar 运行 shell 命令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4620812/

相关文章:

java - 如何制作jar文件?

java - .jar 文件部署 - 无主要方法

java - 如何让 netbeans 停止手持?

java - 如何生成需求,使用单例进行数据库连接的优缺点?

c - exec() C 中的任何命令

jar - 在 Windows 上安装 weblogic 12 jar 时出现问题

java - RabbitMQ 推迟接收

java - 是否有生成 DSL 解析器的工具不需要生成的解析器运行时?

linux - sh shell 中数组中的命令输出

bash - grep 在 bash 脚本中的行为与在交互式 shell 中的行为不同