Domanda

Ho avuto qualche codice che correva attraverso i comandi Runtime.getRuntime.exec (String) , e ha funzionato su Windows. Quando mi sono trasferito il codice per Linux, si è rotto, e l'unico modo di risolverlo è stato quello di passare alla exec (String []) Versione. Se lascio le cose in questo modo, sarà il codice funzionerà lo stesso su Windows e Linux, o devo usare l'exec (String) il (String []) Windows e exec su Linux?

È stato utile?

Soluzione

Usa String [] su entrambi.

La risposta href="https://stackoverflow.com/questions/1080578/i-dont-understand-why-this-classnotfoundexception-gets-thrown/1080800#1080800"> I è stato il risultato di diverse ore miserabili di debug di un software di produzione in esecuzione su Windows.

Dopo un sacco di fatica noi (I) è venuto alla soluzione postato prima (uso String [] )

Poiché i problemi che avete ottenuto erano su Linux, credo che utilizzando la matrice sia sarà il migliore.

A proposito. Ho provato questo metodo con Java 1.4, da allora una nuova classe è disponibile: ProcessBuilder aggiunto il Java1.5. Non sono sicuro che cosa è che tutto, ma ci dovrebbe essere una buona ragione per questo. Date un'occhiata e leggere quello che la differenza tra che un Runtime.exec è. Probabilmente sarà una scelta migliore.

Infine alcuni comandi non funzionano su entrambe le piattaforme perché sono costruiti con guscio (o cmd Windows o bash / sh / etc) come dir o echo e alcuni di quelli. Quindi mi sento di raccomandare di fare test extra / extra su ogni piattaforma di destinazione e aggiungere gestori di eccezioni per i comandi non supportati.

:)

Altri suggerimenti

Va bene, mi arrendo: Quale comando non banale è possibile passare ad exec (), e si aspettano di ottenere risultati ragionevoli sia su Windows e Linux? Chiedendo se exec () è piattaforma tipo indipendente sembra mancare il punto di exec (), che è invocare comportamento specifico della piattaforma.

Per affrontare realmente la tua domanda, sì - il modo in cui la stringa di comando viene interpretato sarà diverso su diverse piattaforme (e potenzialmente, per le diverse conchiglie, su Linux), e utilizzando la versione String [] è più probabilità di finire con i parametri sempre passati correttamente.

Il Tokeniser predefinito per dividere il parametro exec (String) in una stringa [] li divide semplicemente il carattere spazio. Essa non interpreta citazioni come un comando di shell immesso manualmente sarebbe, così si dovrebbe chiamare la versione String []. Ma se si sta utilizzando il Sun JDK su entrambe le piattaforme, il comportamento dovrebbe essere simile.

Tuttavia, come Windows fornisce diversi comandi di shell, come altri sistemi operativi (ad esempio copiare invece di cp), i comandi potrebbero non funzionare su tutte le piattaforme.

La differenza tra il metodo exec () che prende una singola stringa, e quella che accetta un array è che la versione di matrice consente di specificare come il comando ed i suoi argomenti devono essere rotto (es. Correttamente) . Quando si utilizza il metodo (s), che accetta solo una stringa il metodo si rompe in su in un array su spazi bianchi. Elaborazione da allora viene gestita la stessa per entrambi i metodi.

Questo è il codice dalla classe runtime che mostra come si rompe singola stringa in una matrice e quindi chiama String [] versione per continuare l'elaborazione.

   public Process exec(String command, String[] envp, File dir)
            throws IOException {
         if (command.length() == 0)
             throw new IllegalArgumentException("Empty command");

         StringTokenizer st = new StringTokenizer(command);
         String[] cmdarray = new String[st.countTokens()];
         for (int i = 0; st.hasMoreTokens(); i++)
             cmdarray[i] = st.nextToken();
         return exec(cmdarray, envp, dir);
     }

Quindi, il metodo che accetta una stringa non funziona se la rottura del comando su whitspace fa correttamente il comando e argomenti non separati.

Da [API] [1]

  

Questo metodo verifica che cmdarray è un   valido comando del sistema operativo. Quale   comandi sono validi è   dipende dal sistema, ma per lo   Almeno il comando deve essere un non vuota   lista di stringhe non null.

Quindi sì, è dipendente dal sistema. BTW, potrebbe inviare il relativo codice, in modo che possiamo vedere quello che sei (eventualmente) di sbagliato?

[1]: http://java.sun.com/javase/6/docs/api/java/lang/Runtime.html#exec (java.lang.String [] , java.lang.String [], java.io.File)

exec () richiama comandi nativi del sistema operativo sottostante.

I comandi progettati per Windows non funziona su Linux, e dovranno essere riscritti.

Se si desidera eseguire diversi comandi su Windows e Linux si potrebbe scoprire quale sistema operativo è in esecuzione utilizzando qualcosa di simile al seguente:

        String os = System.getProperty("os.name").toLowerCase();
        if (os.indexOf("win") >= 0) {
            // Windows Commands
        } else {
            // Linux Commands
        }

Un altro aspetto positivo sarebbe quella di scrivere sei comandi in uno script (.bat per Windows e .sh per Linux) e chiamare questi script, invece.

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