Откройте Терминал с Java и выполните «java -jar» - PullRequest
0 голосов
/ 17 марта 2019

Я пытаюсь создать исполняемый файл .jar, который снова открывается в консоли терминала Mac.(ради наличия пользовательского интерфейса для ввода команд в программу)

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

Этот код выполняет команду успешно, но без проблем, поэтому я не получаю интерфейс консоли.Как сделать так, чтобы оно открывало видимое окно терминала и выполняло в нем команду?

РЕДАКТИРОВАТЬ: мне удалось открыть терминал, но все еще нужно выяснить, как запустить в нем команду 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 голосов
/ 17 марта 2019

Код, который я использовал в итоге, выполняет некоторый код AppleScript: (как предложил Даниэль Прайден)

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...
}
0 голосов
/ 17 марта 2019

Для создания процессов класс Runtime был заменен классом ProcessBuilder.Очень старая, но все еще актуальная статья, касающаяся класса Runtime (поскольку она была опубликована до добавления класса ProcessBuilder в JDK), - Когда runtime.exec () не будет и также актуальна для класса ProcessBuilder.

Как указано в статье, метод exec() не является "оболочкой" и поэтому не анализирует указанную вами команду как один параметр String.Вы можете помочь методу в разборе, предоставив массив String s.

Я предлагаю вам прочитать статью, а также javadoc для класса java.lang.ProcessBuilder.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...