【问题标题】:Run shell command from jar?从jar运行shell命令?
【发布时间】:2011-06-04 23:35:49
【问题描述】:

从 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]);
    }
}

【问题讨论】:

  • 如果有什么错误?
  • 没有错误,没有异常,什么都没有。这完全让我感到困惑。
  • 您可以编写并导出到具有这种行为的 jar 中的最小程序是什么?
  • 对于这个愚蠢的问题,我深表歉意,但值得一问……如果您从 IDE 运行它是否有效,或者它永远不会有效?
  • 是的,我用的是 Eclipse IDE

标签: java shell jar executable-jar


【解决方案1】:

如果您运行测试程序并使用ps 或任务管理器,您会注意到7z 正在运行。您的问题是您没有使用 Process 的输出。因此,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 流。

【讨论】:

  • 当然我认为命令路径没有问题。
【解决方案2】:

您应该阅读这篇出色的JavaWorld article,了解从 Java 运行外部进程的陷阱。

【讨论】:

    【解决方案3】:

    我猜你的问题在于执行命令的基本路径。有一种方法可以在调用 exec 时显式设置它。

    【讨论】:

      猜你喜欢
      • 2014-08-24
      • 2016-01-02
      • 1970-01-01
      • 2015-06-13
      • 2011-03-03
      • 2015-07-17
      • 2018-07-30
      • 2011-01-28
      • 1970-01-01
      相关资源
      最近更新 更多