Newsgroup: it.comp.java
Titolo: Strano comportamento di Runtime.exec

Ciao a tutti, da un po' di tempo ho il seguente problema...
con il codice che riporto qui di sotto
public class prova
{
    public static void main(String[] argv) throws Exception
    {
        int i=0;
        String command = "";
        for (;i<argv.length-1;i++)
            command += argv[i]+" ";
        command += argv[i];
        System.out.println(command);
        Process p = Runtime.getRuntime().exec(command);
    }
}
succede la seguente cosa
1) java prova notepad
notepad
e si apre la finestra (corretto)
2) java prova notepadd
notepadd
Exception in thread "main" java.io.IOException: CreateProcess: notepadd
error=2
        at java.lang.Win32Process.create(Native Method)
        at java.lang.Win32Process.<init>(Unknown Source)
        at java.lang.Runtime.execInternal(Native Method)
        at java.lang.Runtime.exec(Unknown Source)
        at java.lang.Runtime.exec(Unknown Source)
        at java.lang.Runtime.exec(Unknown Source)
        at java.lang.Runtime.exec(Unknown Source)
        at prova.main(prova.java:13)
(corretto: non ho un file nel path che si chiama notepadd)
3) java prova java
java
(SCORRETTO: mi aspetto che venga stampato
Usage: java [-options] class [args...]
           (to execute a class)
   or  java -jar [-options] jarfile [args...]
           (to execute a jar file)
where options include:
    -cp -classpath <directories and zip/jar files separated by ;>
                  set search path for application classes and resources
    -D<name>=<value>
                  set a system property
    -verbose[:class|gc|jni]
                  enable verbose output
    -version      print product version and exit
    -showversion  print product version and continue
    -? -help      print this help message
    -X            print help on non-standard options)
qualcuno ha qualche idea del prchč di questo strano comportamento?
premetto che č inizialmente il tutto mi funzionava correttamente.... solo da
un po' fa cosě, ma non ne risco a capire il motivo
(ho installato il JDK 1.3.0_01)
GRAZIE

 Usage: java [-options] class [args...]
Ciao! Credo che sia corretto, l'output lo devi catturare
utilizzando l'OutputStream legato al processo creato.
Per questo non lo vedi.
Andrea

 wrote in message
news:29iA8.129867$SR5.3...@twister1.libero.it...

Ok.... raffiniamo l'esempio: se io scrivo
java prova java MyWindow (MyWindow č una classe che apre un JFrame) allora
in effetti vedo la finestra aprirsi
se ora io faccio un file chiamato launcher.bat e dentro ci scrivo java
MyWindow e poi scrivo
java prova launcher.bat
a questo punto non vedo nessuna finestra aprirsi, nessun processo atttivo
etc..... quale č la differenza tra le due versioni
per sicurezza ho anche messo nel classpath la directory in cui si trova
MyWindow.class, ma anche cosě non va....


Il .bat e' un file che deve essere interpretato dalla shell del sistema operativo: per
eseguirlo devi quindi invocare la shell e non direttamente il .bat
Ad esempio, su Win NT:
java Prova cmd /c launcher.bat
Su Windows 95/98/ME
java Prova command /c launcher.bat
Ciao,
    Bruno.
---
| Bruno Bossola
| A Java Software Engineer :-)
| 
http://digilander.iol.it/bbossola

Prova con questo codice
Io l'ho testato e funziona perfettamente
Ciao fammi sapere
 public static void main(String[] args)
  {
    int i;
    String cmd;
    cmd="";
    for(i=0;i<args.length;i++)
    cmd+=args[i]+" ";
    System.out.println(cmd);
    cmd+="\n";
    try
    {
      Process p=Runtime.getRuntime().exec(cmd);
      OutputStream in = p.getOutputStream();
      in.write(cmd.getBytes());
      in.flush();
      InputStream out=new BufferedInputStream(p.getInputStream());
      byte[] b=new byte[1024];
      int    n=out.read(b);
      for(i=0;i<n;i++) 
      System.out.print((char)b[i]);
    }
    catch(Exception ex) { }
  }
}
Spedito da 
http://www.submission.it
promuovi gratis il tuo sito web sui motori di ricerca

 ha scritto nel messaggio
news:3cd23893...@news.inet.it...

ci avevo pensato anche io,,,,... ma all'inizio (cioè quando ho iniziato a
usare questa cosa) non mi ero posto il problema....e funzionando senza
problemi, non mi sono posto il problema.....
xchè prima funzionava e adesso no? da cosa dipende? se il problema è
effettivamente che la shell deve interpretare il bat, c'era forse prima una
strana associazione di file? boh?
PS per inciso su altre macchine da me installate recentemente, il tutto
funziona anche lanciando direttamente i .bat

ok... funziona... ma non del tutto.....
rigiriamo la frittata
devo creare un oggetto che mi faccia da factory per altri oggetti
quindi ho definito un metodo create_object() in cui specifico varie cose tra
cui la linea di comando del file da eseguire
per esempio
il file c:\launcher.bat (fa java MyWindow)
io invoco sull'oggetto factory create_object("c:\launcher.bat")
e questo oggetto fa Runtime.getRuntime().exec(command);
e non parte nulla..........
ma non parte lo stesso anche se faccio Runtime.getRuntime().exec("cmd /c
"+command);
qual'è la differenza tra questo e invece l'esempietto stupido di cui sopra?

aggiornamento:
se il file launcher.bat è
start java -D...... MyWindow
facendo
1) Runtime.getRuntime().exec("launcher.bat"), non parte nulla
2) Runtime.getRuntime().exec("cmd /c launcher.bat"), non parte nulla
3) Runtime.getRuntime().exec("cmd /c start java -D.... MyWindow"), parte
il mio problema è che devo realizzare una factory GENERICA... e quindi la
mia idea era quella di specificare una proprietà opportuna con il bat (o exe
o altro) che faccia l'init degli altri oggetti......
forse risolvo impostando come propietà direttamente il comando che voglio
eseguire senza passare per .bat o altro...
ma a questo punto vorrei almeno scoprire perchè diavolo su alcune macchine
funziona il caso1 e su altre (con stesso jdk, stesso SO) funziona solo il
caso3
se qualcuno scopre l'arcano e me lo fa sapere............mi fa un grosso
piacere...
ciao a tutti


Afaik l'unico motivo per cui non parte cmd /c pippo.bat e' perche' non sei su Windows NT /
2000. Se lo lanci as-is dalla linea di comando funge? 


si si ... se lo lancio da riga di comando funziona
il sistema su cui sto è win2000
per essere precisi c'è un server java su cui posso invocare la
create_object; nella create object c'è questa benedetta exec e vorrei che si
aprisse un nuovo processo java ...
tutto qui....


Non e' che nella variabile PATH per quella particolare istanza di shell non e' compresa la
directory in cui si trova cmd.exe?
P.S.
Non capisco "create_object": di che server parli?



create_object è un metodo che ho definito in una mia interfaccia...
CIAO