Как запустить установленную команду терминала в java? - PullRequest
0 голосов
/ 13 апреля 2020

Я недавно писал программу, которая использовала ProcessBuilder для запуска команд терминала, но всякий раз, когда я запускаю программу, я получаю эту ошибку:

java.io.IOException: Cannot run program "convert": error=2, No such file or directory
    at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1128)
    at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1071)
    at Downloader.uncompressImage(Downloader.java:37)
    at Main.main(Main.java:51)
Caused by: java.io.IOException: error=2, No such file or directory
    at java.base/java.lang.ProcessImpl.forkAndExec(Native Method)
    at java.base/java.lang.ProcessImpl.<init>(ProcessImpl.java:319)
    at java.base/java.lang.ProcessImpl.start(ProcessImpl.java:250)
    at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1107)
    ... 3 more

Я почти уверен, что эта ошибка, потому что она не может найти, где Команда "convert" расположена потому, что это команда, используемая ImageMagick, которую я установил на свой компьютер. Я знаю, что команда работает, потому что, если я набираю команду в обычном окне терминала, она работает.

Если дело в том, что нужно указать местоположение для команды "convert", я все еще не знаю, где она так что если кто-нибудь ответит на этот вопрос, он также скажет мне, как его найти, это было бы удивительно.

В целом, я почти уверен, что команда convert вызывает ошибку, потому что это третья сторона команда, поэтому мой вопрос, как мне использовать команду convert без получения сообщения об ошибке, и если решение требует, чтобы я нашел каталог команды convert, как мне это сделать?

Если кто-то хотел посмотрите код, который вызывает ошибку, это:

public void uncompressImage (String name, boolean back, String path) {

        String b = "";  

        name = name.toLowerCase().replace("-", "").replace(" ", "").replace(".", "");

        if (back) {

            b = "-back";

        }

        ProcessBuilder pb = new ProcessBuilder();

        String[] args = new String[] {"convert" , name + b + ".gif", "-coalesce", name + b + ".gif"};

        try {
            pb.command("cd " + path);
            pb.command(args);
            Process process = pb.start();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

(Этот код работает на MacOS)

Редактировать: я уже пытался проверить path и name и оба они верны.

1 Ответ

2 голосов
/ 13 апреля 2020

Используйте ProcessBuilder.directory(File) вместо cd. Добавьте inheritIO(), чтобы увидеть, что происходит. И не забудьте waitFor() ваш Process для завершения. Например,

try {
    pb.inheritIO();
    pb.directory(new File(path));
    pb.command(args);
    Process process = pb.start();
    process.waitFor();
} catch (IOException e) {
    e.printStackTrace();
} catch (InterruptedException e) {
    e.printStackTrace();
}

Вам также может потребоваться изменить "convert" на "/usr/local/bin/convert" (в зависимости от того, как и где он установлен).

...