Java - Runtime.exec () не запускается - PullRequest
0 голосов
/ 02 ноября 2018

Когда я пытаюсь запустить любую команду Runtime.exec (), например, такую ​​простую, чтобы напечатать версию Java:

String [] cmd = { "java", "-version" };
Runtime runtime = Runtime.getRuntime();
Process process = runtime.exec(cmd);

BufferedReader stdError = new BufferedReader( new InputStreamReader( process.getErrorStream() ) );
String s = null;

while ( ( s = stdError.readLine() ) != null )
    System.out.println(s);

Работает просто отлично, но если я использую JRE в комплекте с моим Java-приложением, я всегда получаю сообщения о том, что java неизвестен:

java.io.IOException: Cannot run program "java": error=2, No such file or directory
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1048)
    at java.lang.Runtime.exec(Runtime.java:620)
    at java.lang.Runtime.exec(Runtime.java:450)
    at java.lang.Runtime.exec(Runtime.java:347)
    at org.runner.Runner.main(Runner.java:11)

Почему это происходит при использовании JRE в комплекте?

Ответы [ 4 ]

0 голосов
/ 10 марта 2019

Я столкнулся с этой проблемой и на MacOS. Это затронуло только мое приложение при использовании моего jre. Пока переход на «форк» (как вы и сделали в своем ответе) сработал для меня. Мне было любопытно, что должно быть «лучшее» решение, так как отчет об ошибке, на который вы указали, был зарегистрирован и исправлен несколько лет назад. Поэтому, немного покопавшись, я обнаружил, что в MacOS есть исполняемый файл в комплекте jre (../jre/Contents/Home/jre/lib/jspawnhelper), который должен быть исполняемым для Runtime.exec () работать. Это было не так, но как только я сделал его исполняемым, мои процессы работали без ошибок.

Чтобы сделать его исполняемым, я добавил это в файл build.properties в функции, которая связывает jre:

root.macosx.cocoa.x86_64.permissions.755=jre/Contents/Home/jre/lib/*

Возможно, вам придется внести коррективы в эту строку в зависимости от вашей арки и jre местоположения.

0 голосов
/ 02 ноября 2018
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

публичный класс PP {

    public void pop(){
    String [] cmd = { "java", "-version" };
    Runtime runtime = Runtime.getRuntime();
    Process process = null;
    try {
        process = runtime.exec(cmd);
    } catch (IOException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }

    BufferedReader stdError = new BufferedReader( new InputStreamReader( process.getErrorStream() ) );
    String s = null;

    try {
        while ( ( s = stdError.readLine() ) != null )
            System.out.println(s);
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    }
        public static void main(String []args){
            PP pp=new PP();
        pp.pop();
        }

}

0 голосов
/ 03 ноября 2018

После долгих исследований я смог это исправить. Я добавлю свое рабочее решение здесь, может быть, оно поможет кому-то, имеющему ту же проблему:

Эта проблема вызвана из-за этой сообщенной ошибки JDK: https://bugs.java.com/view_bug.do?bug_id=5049299

И так как у меня есть эта проблема в Mac OS X, для меня было безопасно использовать «fork» вместо «posix_spawn», установив свойство Java System:

if( isMacOSX() ) System.setProperty( "jdk.lang.Process.launchMechanism", "FORK" );

Это может быть обескураженное решение, но оно действительно исправило огромную проблему для меня в Mac OS X.

0 голосов
/ 02 ноября 2018

Убедитесь, что java добавлено в переменную окружения PATH. Если это не так, используйте абсолютный путь к исполняемому файлу. Например ::

String [] cmd = { "//usr//bin//java", "-version" };
...