Problema con il servizio OpenOffice di partenza (soffice) da Java (comando lavora in linea di comando, ma non da Java)
-
22-08-2019 - |
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?
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).