Проблема с запуском сервиса OpenOffice (soffice) из Java (команда работает в командной строке, но не из Java) - PullRequest
2 голосов
/ 18 декабря 2008

Я хочу исключить простую команду, которая работает из оболочки, но не работает из Java. Это команда, которую я хочу выполнить, которая отлично работает:

soffice -headless "-accept=socket,host=localhost,port=8100;urp;" 

Это код, который я исключаю из Java, пытаясь выполнить эту команду:

String[] commands = new String[] {"soffice","-headless","\"-accept=socket,host=localhost,port=8100;urp;\""};
Process process = Runtime.getRuntime().exec(commands)
int code = process.waitFor();
if(code == 0)
    System.out.println("Commands executed successfully");

Когда я запускаю эту программу, я получаю «Команды выполнены успешно». Однако процесс не выполняется, когда программа заканчивается. Возможно ли, что JVM убьет программу после ее запуска?

Почему это не работает?

Ответы [ 4 ]

2 голосов
/ 18 декабря 2008

Я не уверен, что не ошибаюсь, но, насколько я вижу, вы генерируете команды, но никогда не передаете их методу "execute" ... вы выполняете "".

Попробуйте использовать Runtime.getRuntime (). Exec (команды) =)

1 голос
/ 21 января 2009

Я хотел бы сказать, как я решил это. Я создал скрипт sh, который в основном запускает для меня команду soffice.

Затем из Java я просто запускаю скрипт, и он работает нормально, например:

public void startSOfficeService() throws InterruptedException, IOException {
        //First we need to check if the soffice process is running
        String commands = "pgrep soffice";
        Process process = Runtime.getRuntime().exec(commands);
        //Need to wait for this command to execute
        int code = process.waitFor();

        //If we get anything back from readLine, then we know the process is running
        BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream()));
        if (in.readLine() == null) {
            //Nothing back, then we should execute the process
            process = Runtime.getRuntime().exec("/etc/init.d/soffice.sh");
            code = process.waitFor();
            log.debug("soffice script started");
        } else {
            log.debug("soffice script is already running");
        }

        in.close();
    }

Я также уничтожаю процесс soffice, вызывая этот метод:

public void killSOfficeProcess() throws IOException {
        if (System.getProperty("os.name").matches(("(?i).*Linux.*"))) {
            Runtime.getRuntime().exec("pkill soffice");
        }
    }

Обратите внимание, что это работает только в Linux.

0 голосов
/ 19 февраля 2009

"/Applications/OpenOffice.org\ 2.4.app/Contents/MacOS/soffice.bin -headless -nofirststartwizard -accept='socket,host=localhost,port=8100;urp;StartOffice.Service'"

или просто экранирование кавычек также будет работать. Мы передаем команду, подобную этой, муравьиному сценарию, который в конечном итоге заканчивается вызовом exec, как вы делали выше. Я также рекомендовал бы перезапускать процесс каждые 500 или около того преобразований, потому что OOO неправильно освобождает память (в зависимости от используемой версии).

0 голосов
/ 18 февраля 2009

Полагаю, вы не правильно обращаетесь с цитатами. Исходная командная строка sh содержит двойные кавычки, чтобы оболочка не интерпретировала точки с запятой. Оболочка снимает их до того, как процесс soffice их видит.

В вашем Java-коде оболочка никогда не увидит аргументы, поэтому дополнительные двойные кавычки (без обратной косой черты) не нужны - и они, вероятно, сбивают сообразие.

Вот код с лишними кавычками (и с точкой с запятой)

String[] commands = new String[] {"soffice","-headless","-accept=socket,host=localhost,port=8100;urp;"};
Process process = Runtime.getRuntime().exec(commands);
int code = process.waitFor();
if(code == 0) 
    System.out.println("Commands executed successfully");

(Отказ от ответственности: я не знаю Java, и я не проверял это!)

...