Problema con il servizio OpenOffice di partenza (soffice) da Java (comando lavora in linea di comando, ma non da Java)

StackOverflow https://stackoverflow.com/questions/378338

Domanda

Voglio exceute un semplice comando che funziona dal guscio, ma non funziona da Java. Questo è il comando che voglio da eseguire, che funziona bene:

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

Questo è il codice che sto excecuting da Java cercando di eseguire questo comando:

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");

Quando eseguo questo programma ottengo "comandi eseguiti con successo". Tuttavia il processo non è in esecuzione al termine del programma. E 'possibile che la JVM uccide il programma dopo la sua esecuzione?

Perché non fa questo lavoro?

È stato utile?

Soluzione 2

Vorrei dire come ho risolto questo. Ho creato uno script sh che, in fondo eseguire il comando di soffice per me.

Poi da Java ho appena eseguito lo script, e funziona benissimo, in questo modo:

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();
    }

Ho anche uccidere il processo soffice chiamando questo metodo:

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

Si noti che questo funziona solo in Linux.

Altri suggerimenti

Non sono sicuro se non mi sbaglio, ma per quanto vedo che sta generando i comandi ma non li passa al metodo "eseguire" ... si sta eseguendo "".

Provare a utilizzare Runtime.getRuntime (). Exec (comandi) =)

credo che non sta gestendo citando correttamente. La riga di comando sh originale comprende le virgolette per evitare che la shell interpretare i punti e virgola. Il guscio li spoglia prima del processo soffice li vede.

Nel codice Java il guscio non vedrà mai gli argomenti, in modo che i doppi apici supplementari (scappati con backslash) non sono necessari -. E sono probabilmente confondono soffice

Ecco il codice con le quotazioni in più spogliato fuori (e un punto e virgola gettato in)

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");

(Disclaimer:! Non so di Java, e non ho ancora testato questo)

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

o semplicemente sfuggire le virgolette funzionerà pure. Diamo da mangiare un comando come questo a uno script formica che alla fine finisce in una chiamata exec come si dispone sopra. Auspico inoltre riavviare il processo ogni 500 o giù di lì conversioni perché OOO non lo fa correttamente memoria libera (a seconda della versione in esecuzione).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top