如何让我的jar文件打开一个终端窗口来运行其他类?

时间:2016-09-05 15:43:12

标签: java jar terminal

我正在尝试创建一个运行主类的Jar文件,该主类打开一个新的终端窗口并从该Jar内部运行其他类。

我看到这个讨论“How do I make my java application open a console/terminal window?”而Brandon Barajas的答案正是我所寻找的,但仅限于Windows。我知道如何进行系统检测,但我不能让程序对mac和linux做同样的事情。有人(也许布兰登)可以帮助我吗?

编辑:

我能够使用此命令Runtime.getRuntime().exec(new String[]{"/usr/bin/xterm","-e","java -Dfile.encoding=UTF8 -jar \"" + "/" + filename + "\""+"; bash"});使其在Linux中运行 打开xterm并发出命令,但我仍然不知道如何使它适用于mac终端。

编辑2:

现在我可以使用打开mac终端了 Runtime.getRuntime().exec("/usr/bin/open -a Terminal /usr/bin/java"); 但它仍然不接受运行我的程序的参数。它只打开终端,运行java并退出。如果我尝试使用 Runtime.getRuntime().exec("/usr/bin/open -a Terminal /usr/bin/java -jar" + filename); 它什么都不做。

1 个答案:

答案 0 :(得分:0)

您只需更改在各种平台上启动java可执行文件所需的命令即可。对于Linux,这已经在这里得到了解答 How to open a command terminal in Linux? 对于mac来说,它会变得相似。

编辑1

链接的答案使用以下参数

String[] cmdArray = {"xterm", "-e", myScript + " ; le_exec"};
r.exec(cmdArray).waitFor();

-e参数很重要。它告诉xterm执行另一个命令。请仔细阅读答案并根据您的需求进行调整,同时考虑&#34 ;; 。le_exec"如果xterm没有打开,请检查路径和权限是否正确。

编辑2/3 对于mac,这个问题已在Open a new prompt/terminal window from Java

中得到解答
Runtime.getRuntime().exec("/usr/bin/open", "-a", "Terminal", "/usr/bin/java", "-jar", filename);

在你的情况下,可执行文件是java。 Open a new prompt/terminal window from Java

如果你的文件名(包括路径)包含空格,你可能会遇到另一个问题,这个问题已经在这里处理Why does Runtime.exec(String) work for some but not all commands?。我编辑了mac的命令行,为参数使用单独的字符串。你能试着看看它是否有效吗?

编辑4:

或者,您可以编写命令" / usr / bin / java-jar' your.jar'"到脚本文件,使其可执行并执行它。

import java.io.IOException;
import java.io.PrintWriter;

public class TestClass {
    public static void main(String[] args) throws IOException {
        String jarFileName = "someJar.jar";
        String scriptFileName = "/tmp/script.sh";

        PrintWriter writer = new PrintWriter(scriptFileName, "UTF-8");
        writer.println("#!/usr/bin/env bash");
        writer.println("/usr/bin/java - jar '" + jarFileName + "'");
        writer.close();
        Runtime.getRuntime().exec("chmod u+x " + scriptFileName);
        Runtime.getRuntime().exec(new String[] {"/usr/bin/open", "-a", "Terminal", scriptFileName});
    }
}