使用Java打开Terminal并执行“ java -jar”

时间:2019-03-17 09:24:43

标签: java macos

我正在尝试创建一个可执行文件.jar,该文件会在Mac的终端控制台中重新打开。 (为了使用户界面可以在程序中输入命令)

// if program is not open in Terminal:
Runtime.getRuntime().exec("java -jar \"" + path + "\" isInConsole");
System.exit(0);

此代码成功但无缝地执行了命令,因此我没有控制台UI。如何使其打开可见的终端窗口并在其中执行命令?

编辑:我设法打开了终端,但是仍然需要弄清楚如何在其中运行java -jar ...命令。

这有效:

String arg = "cd /Users/potato/Desktop";
Runtime.getRuntime().exec("open -a Terminal --args " + arg);

但这不起作用:

String arg = "java -jar /Users/potato/Desktop/test.jar isInConsole";
Runtime.getRuntime().exec("open -a Terminal --args " + arg);

2 个答案:

答案 0 :(得分:0)

对于创建流程,类Runtime已被类ProcessBuilder取代。关于Runtime类的一个非常古老但仍很相关的文章(因为它是在将ProcessBuilder类添加到JDK之前发布的)是When runtime.exec() won't,并且也与ProcessBuilder类有关。 / p>

如文章中所述,方法exec()不是“ shell”,因此不会将您提供的命令解析为单个String参数。您可以通过提供String数组来帮助该方法进行解析。

我建议您阅读该文章,以及类java.lang.ProcessBuilder javadoc

答案 1 :(得分:0)

我最终使用的代码执行了一些AppleScript代码:(如DanielPryden建议的那样)

public static void main(String[] args){
    if(args.length == 0 && System.getProperty("os.name").toLowerCase().contains("mac")){
        try {
            String path = new File(Main.class.getProtectionDomain().getCodeSource().getLocation().toURI()).getAbsolutePath();
            String command = "tell application \"Terminal\"\n" + 
                    "do script \"java -jar \'" + path + "\' isInConsole\"\n" + 
                    "close the front window\n" + // because "do script..." opens another window
                    "activate\n" + 
                    "end tell";
            String[] arguments = new String[]{"osascript", "-e", command};

            Runtime.getRuntime().exec(arguments);
            System.exit(0);
        } catch (IOException | URISyntaxException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    // program continues...
}