从jar运行shell命令?

时间:2011-01-06 22:46:24

标签: 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]);
    }
}

3 个答案:

答案 0 :(得分:2)

如果您运行测试程序并使用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流。

答案 1 :(得分:2)

你应该阅读这篇关于从Java运行外部进程的陷阱的优秀JavaWorld article

答案 2 :(得分:1)

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