View Full Version : java-batch interruzione dell'esecuzione
AF.D.O.C
11-05-2011, 12:22
Salve a tutti!
premetto non ho mai scritto un file batch! però adesso ne ho la necessità!! =)
Ho scritto un batch che mi attiva l'esecuzione di un eseguibile jar che non è altro che un server.
@echo off
cd example
java -jar start.jar
EXIT
Il file batch lo richiamo da codice java in questo modo:
processo = Runtime.getRuntime().exec("attivaServer.bat");
e va perfettamente. Il problema è che quando voglio terminare il processo da codice java eseguo
processo.destroy();
ma il processo mi rimane aperto.
Qualcuno sa aiutarmi?
grazie!!
Apparentemente Process non funziona tanto bene quando si passa per una shell.
Secondo le voci che circolano, dovrebbe invece funzionare se no passi per il file bat ma esegui direttamente java.exe.
A naso dovrebbe essere una cosa di questo genere:
ProcessBuilder pb = new ProcessBuilder(
"percorso eseguibile java completo",
"-jar"
"start.jar");
pb.directory(new File("percorso della cartella di esecuzione"));
Process p = pb.start();
Va da sè che trattandosi di un programma java che ne lancia un altro si potrebbe tranquillamente evitare tutto questo giro e limitarsi ad invocare il metodo main della classe principale di quello start.jar. Beneficeresti dello stato della jvm di partenza, in termini di performance, anche se rischieresti di far precipitare il programma "padre" in comcomitanza con eventuali errori del "figlio".
AF.D.O.C
11-05-2011, 12:59
Grazie per aver risposto!
Ho provato a fare quello che mi hai consigliato te, nel dettaglio ho scritto:
ProcessBuilder pb = new ProcessBuilder(
"C:\\Users\\io\\Documents\\NetBeansProjects\\progetto\\example",
"-jar",
"start.jar");
pb.directory(new File("C:\\Users\\io\\Documents\\NetBeansProjects\\progetto\\example\\start.jar"));
processo = pb.start();
e ho ottenuto questo errore:
11-mag-2011 12.58.07 MotoreDiRicerca.ServerSolr attiva
GRAVE: null
java.io.IOException: Cannot run program "C:\Users\io\Documents\NetBeansProjects\progetto\example" (in directory "C:\Users\io\Documents\NetBeansProjects\progetto\example\start.jar"): CreateProcess error=267, Nome di directory non valido
at java.lang.ProcessBuilder.start(ProcessBuilder.java:460)
at MotoreDiRicerca.ServerSolr.attiva(ServerSolr.java:39)
at Interfaccia.Home.attivaServer(Home.java:240)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at com.trolltech.qt.internal.QSignalEmitterInternal$AbstractSignalInternal.emit_helper(QSignalEmitterInternal.java:368)
at com.trolltech.qt.QSignalEmitter$Signal1.emit(QSignalEmitter.java:209)
at com.trolltech.qt.gui.QApplication.exec(Native Method)
at Interfaccia.Home.main(Home.java:43)
Caused by: java.io.IOException: CreateProcess error=267, Nome di directory non valido
at java.lang.ProcessImpl.create(Native Method)
at java.lang.ProcessImpl.<init>(ProcessImpl.java:81)
at java.lang.ProcessImpl.start(ProcessImpl.java:30)
at java.lang.ProcessBuilder.start(ProcessBuilder.java:453)
... 10 more
:(
La prima stringa è il percorso dell'eseguibile java, nel senso di "java.exe".
ProcessBuilder funziona un po' come la linea nel batch, là scrivi:
java -jar start.jar
Nel costruttore del process builder scrivi la stessa cosa solo che usi una stringa per ogni pezzo. Diventa:
... new ProcessBuilder("java", "-jar", "start.jar");
Con l'inghippo di dover usare i percorsi assoluti perchè non è detto che "java" sia nel path del programma di partenza, quindi dovrai dire, nel caso di windows e ad esempio:
...new ProcessBuilder(
"c:\\users\\pgi\\jre\\bin\\java.exe",
"-jar",
"c:\\users\\pgi\\progetti\\server\\start.jar");
Se specifichi la directory di lavoro (con directory(File)) allora puoi omettere (se non ricordo male) il percorso completo di start.jar perchè java.exe include nel classpath la directory di lavoro, quindi dovresti poter dire:
ProcessBuilder pb = new ProcessBuilder(
"c:\\users\\pgi\\jre\\bin\\java.exe",
"-jar",
"start.jar");
pb.directory(new File("c:\\users\\pgi\\progetti\\server"));
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.