【问题标题】:Open Terminal with Java and execute "java -jar"用 Java 打开终端并执行“java -jar”
【发布时间】:2019-03-17 21:05:53
【问题描述】:

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

// 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);

【问题讨论】:

  • Well Terminal 是一个应用程序,位于 /Applications/Utilities/ 下
  • 如果您的最终目标是执行 bash 命令或脚本,那么您可能应该忘记运行终端,而是查看 ProcessBuilder 类来执行您的命令。
  • @JoakimDanielson 我的最终目标是在终端窗口中重新打开我的可执行 jar,以便使用控制台与我的程序进行交互。
  • 您可能需要使用 AppleScript 来启动 Terminal.app,然后在其中运行您的程序。例如,请参见:stackoverflow.com/questions/33033606。您最好尝试从可执行的 jar 中完成所有这些操作。对于一个简单的用例,只需将 jar 放在某个已知位置,然后编写一个 shell 脚本来启动它,然后将该 shell 脚本放在您的桌面上。

标签: java macos


【解决方案1】:

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

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

我建议你阅读这篇文章以及 java.lang.ProcessBuilder 类的 javadoc

【讨论】:

    【解决方案2】:

    我最终使用的代码执行了一些 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...
    }
    

    【讨论】:

      猜你喜欢
      • 2017-12-16
      • 2014-07-02
      • 2019-03-11
      • 1970-01-01
      • 2013-03-21
      • 2015-07-22
      • 1970-01-01
      • 2014-07-20
      • 2020-05-14
      相关资源
      最近更新 更多