【问题标题】:How do I make my jar file open a terminal window to run other class?如何让我的 jar 文件打开终端窗口以运行其他类?
【发布时间】:2016-09-05 15:43:11
【问题描述】:

我正在尝试制作一个 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:

现在我可以使用 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); 它什么都不做。

【问题讨论】:

标签: java jar terminal


【解决方案1】:

您只需更改在各种平台上启动 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 执行另一个命令。请仔细阅读答案并根据您的需要进行调整,包括“; 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});
    }
}

【讨论】:

  • 我试过这样做:codeRuntime.getRuntime().exec(new String[]{"/usr/bin/xterm","java -Dfile.encoding=UTF8 -jar \" " + 文件名 + "\""} code 但什么也没发生。如果我使用终端运行,它可以工作,但如果我双击 jar,它什么也不做。
  • 感谢您的回答。我能够使其适用于 linux 并尝试按照您对 mac 的说明进行操作,但有两个问题:我需要为 java 提供参数来运行我的程序,不仅从终端运行 java,而且如果我使用`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 );但它什么也没做。
  • 我正在这样做:if(nameOs.startsWith("Mac")){ Runtime.getRuntime().exec(new String[]{"/usr/bin/open", "-a", "Terminal", "/usr/bin/java", "-jar", filename }); } where filename = Main.class.getProtectionDomain().getCodeSource().getLocation().toString().substring(6); String nameOs=System.getProperty("os.name"); 但它仍然不起作用。
  • 你能详细描述一下,会发生什么吗?它根本不运行,是否给出错误消息?您是否尝试将命令“java -jar jarfile.jar”放入文件并启动该文件?将参数传递给 java 是否有效,即您是否尝试过“/usr/bin/open”、“-a”、“Terminal”、“/usr/bin/java”、“-v”来打印 jvm 版本? jar 文件是否在正确的位置? java的文件名是否包含特殊字符或空格?请提供尽可能多的关于您正在做什么的信息。否则很难提供帮助。
  • 它根本不运行。如果我使用“/usr/bin/open”、“-a”、“Terminal”、“/usr/bin/java”,它就像我在终端中调用 java 并退出一样运行,但如果我使用任何参数,它不会甚至不打开终端。 jar 文件位于正确的位置,并且在可执行文件中使用“java -jar jarfile.jar”可以工作,但这无济于事,因为我的文件的路径将在我的程序中定义,正如我在之前的评论中解释的那样.文件名没有特殊字符。它在linux和windows中运行良好。显然问题是 mac 语法,因为当我尝试传递参数时问题就开始了。
猜你喜欢
  • 2017-01-09
  • 1970-01-01
  • 2020-01-25
  • 2015-10-25
  • 2015-03-05
  • 1970-01-01
  • 2014-08-07
  • 2011-12-04
相关资源
最近更新 更多