Lanciare programma java...in un programma java

di il
5 risposte

Lanciare programma java...in un programma java

Avrei un problemino con la classe Runtime; vorrei lanciare un programma cliccando su una icona di un programma java

try {
            Runtime run=Runtime.getRuntime();
            run.exec("Calc.jar");
        } catch (IOException ex) {
            ex.printStackTrace();
        }
mi da un errore

java.io.IOException: Cannot run program "Calc.jar": CreateProcess error=193, %1 non è un'applicazione di Win32 valida
ciò vuol dire che con Windows posso far eseguire solo programmi di Windows?
Come potrei risolvere?

5 Risposte

  • Re: Lanciare programma java...in un programma java

    federaimondi ha scritto:


    ciò vuol dire che con Windows posso far eseguire solo programmi di Windows?
    Runtime.exec avvia qualunque cosa che il SO ritiene "eseguibile" (quindi dipende anche dalla piattaforma COSA sia eseguibile). E file .jar non sono "eseguibili" di per sé per il sistema. Sono "eseguibili" da un Runtime Java.

    Quindi bisogna avviare la JVM e passare il jar da "lanciare".
    Runtime.getRuntime().exec(new String[] { "java", "-jar", "blablabla/appxyz.jar" });
  • Re: Lanciare programma java...in un programma java

    Ora funziona.
    Andbin sei il mio mito, edificherò un monumento in tuo onore
  • Re: Lanciare programma java...in un programma java

    Prego. Tieni solo presente che con gli exec() c'è la questione un po' "spinosa" degli standard-in/out/err della applicazione lanciata. Con gli exec() questi 3 stream della applicazione lanciata vengono rediretti verso la applicazione java che ha fatto exec(). Quindi se ti va bene o no il comando citato, dipende anche da se/cosa fa la applicazione lanciata sugli standard-in/out/err.
  • Re: Lanciare programma java...in un programma java

    Nel mio caso il programma non fa assolutamente niente, nessun System o Buffered, è una semplice calcolatrice
    Probabilmente ho lasciato qualche System.out.println per controllare qualcosa, in quel caso potrebbe piantarsi il programma?
  • Re: Lanciare programma java...in un programma java

    federaimondi ha scritto:


    Probabilmente ho lasciato qualche System.out.println per controllare qualcosa, in quel caso potrebbe piantarsi il programma?
    Per questioni di "buffering" tra Java e l'applicazione lanciata, se quest'ultima fa anche solo moderatamente dell'output su std-out/err, questo andrebbe letto, altrimenti l'applicazione lanciata può bloccarsi.

    Quindi ci sono diverse alternative:
    a) Dal exec() ottieni il Process, prendi il InputStream del std-out e fai un thread a parte che legge l'output del processo. Ciò che leggi lo puoi "buttare via" (non ne fai nulla) o puoi stamparlo da qualche parte. Questo richiede un po' di attenzione, non lo consiglio se non per motivi validi.

    b) Cambi il comando (usando cose specifiche del SO) per avviare l'applicazione in modo che abbia una sua propria console.

    c) Usi ProcessBuilder invece che Runtime.exec usando anche una nuova feature introdotta in Java 7 che è il suo metodo inheritIO() che permette alla applicazione lanciata di "ereditare" gli stream del processo padre. Se la tua applicazione principale ha una sua console, sarà usata anche per il processo lanciato.
Devi accedere o registrarti per scrivere nel forum
5 risposte