Newsgroup: it.comp.java
Titolo: Invocare un prg java da un prg java

Come da oggetto...
Sto scrivendo un programma. Da questo voglio chiamare un altro
programma java. Entrambi lavorano con GUI. C'è un modo specifico per
fare ciò, magari semplicemente con un import? (tenete presente che
comunque ci sono 2 main e che il secondo programma riceve un parametro
dal programma principale)
Devo per forza eseguire una exec(javac "nomePrg.java parametri"); ?
Mi illuminate?
Grazie.
Ale

 writes:
A> Devo per forza eseguire una exec(javac "nomePrg.java parametri"); ?
Il primo programma può benissimo invocare il metodo main() del secondo :)
-- 
 /\            ___
/___/\__|_|\_|__|___Gian Uberto Lauri_____________________
  //--\ | | \|  |   Integralista GNUslamico  
\/		    e allevatore di bug da competizione

Quindi creo un oggetto di tipo
E come lo invoco? Come creo l'oggetto "Programma2"?
Era questo fondamentalmente il mio dubbio
Forse è banalissimo ma dopo 2 giorni di programmazione intensiva e 5
ore di sonno probabilmente mi sfuggono anche le cose più stupide... :)

 E come lo invoco? Come creo l'oggetto "Programma2"?
Se hai i sorgenti di "programma2" nel tuo programma puoi scrivere
programma2 pg2;
pg2.main(argomenti vari);
Semplice!
Ovviamente al posto di programma2 metti la classe che contiene il main.

 Devo per forza eseguire una exec(javac "nomePrg.java parametri"); ?
Questo è un'altro sistema, ma parte un'altra VM.

 Semplice!
Già, semplice. Peccato che main sia static.
E perchè i sorgenti?



Devi tenere conto di un po' di cose:
1) Le classi del programma figlio dovranno essere raggiungibili dal
classloader del programma padre: o includi i percorsi di entrambi i
programmi nel classpath (passandoli come argomento dell'opzione -cp) oppure
puoi costruirti al volo un URLClassLoader -puoi benissimo usarlo per
riferirti a file locali- e usare la reflection per caricare la classe
desiderata e invocare il main del programma figlio;
2) Il programma figlio deve girare come un programma a se stante: se invochi
il main() della classe principale-figlia, il thread chiamante rimane
bloccato finchè quel main() non ritorna. Ti conviene piuttosto avviare il
main su un thread secondario:
   Thread childProgram=new Thread(new Runnable() {
      public void run() {
         ClassePrincipaleFiglia.main(<argomenti>);
      }
   });
   childProgram.start();
3) Anche se in questo modo i due programmi gireranno in modo indipendente,
ricordati sempre che si tratta di thread che girano nella stessa Java
Virtual Machine, quindi nello stesso spazio di indirizzi. Questo vuol dire
che elementi statici delle classi caricate da entrambi saranno visibili e
modificabili da entrambi i programmi (ma non ne sono sicuro se usi il metodo
URLClassLoader con reflection) e con Swing/AWT non è un'ottima idea - almeno
finchè non ci verrà garantito da Sun che TUTTE le api Swing/AWT siano
thread-safe. Fai sempre più test che puoi, controlla ogni minima interazione
possibile tra i due programmi. E soprattutto, in bocca al lupo!
-- 
Fermiamo scientology prima che sia troppo tardi!!!
http://xenu.com-it.net
 - 
http://xenu.freewinds.cx/
 - 
http://www.xenu.net/
(per rispondere personalmente leva IlDitoDalCulo)

Il 24 Mar 2006 12:28:57 -0800, blackfede ha scritto:

Devi tenere conto di un po' di cose:
1) Le classi del programma figlio dovranno essere raggiungibili dal
classloader del programma padre: o includi i percorsi di entrambi i
programmi nel classpath (passandoli come argomento dell'opzione -cp) oppure
puoi costruirti al volo un URLClassLoader -puoi benissimo usarlo per
riferirti a file locali- e usare la reflection per caricare la classe
desiderata e invocare il main del programma figlio;
2) Il programma figlio deve girare come un programma a se stante: se invochi
il main() della classe principale-figlia, il thread chiamante rimane
bloccato finchè quel main() non ritorna. Ti conviene piuttosto avviare il
main su un thread secondario:
   Thread childProgram=new Thread(new Runnable() {
      public void run() {
         ClassePrincipaleFiglia.main(<argomenti>);
      }
   });
   childProgram.start();
3) Anche se in questo modo i due programmi gireranno in modo indipendente,
ricordati sempre che si tratta di thread che girano nella stessa Java
Virtual Machine, quindi nello stesso spazio di indirizzi. Questo vuol dire
che elementi statici delle classi caricate da entrambi saranno visibili e
modificabili da entrambi i programmi (ma non ne sono sicuro se usi il metodo
URLClassLoader con reflection) e con Swing/AWT non è un'ottima idea - almeno
finchè non ci verrà garantito da Sun che TUTTE le api Swing/AWT siano
thread-safe.
4) Come mi ha ricordato Vincent Vega, una System.exit(0) termina TUTTI i
thread, indistintamente. Di tutti e due i programmi.


Vi spiego il mio cruccio:
Ho molta, moltissima fretta, di finire questo programma. So che non è
un buon punto di partenza ma purtroppo le scadenza sono queste.
Ho 2 programmi distinti e funzionanti. Entrambi estendono JPanel come
finestra principale. (ommammamia come mi spiego male! Sono arrivato al
limite mi sa!)
Quando dal primo programma apro un documento, si deve visualizzare la
forma grafica di tale documento (e il programma che fa ciò è proprio
il secondo)
Volevo Avrei voluto avere 2 finestre diverse, non bloccanti tra loro,
con la seconda che si apre al momento della necessità e che si chiude
se chiudo il primo programma. L'idea del thread mi sembrava la più
appropriata e la più comoda nel mio caso, ma se mi dite che le api
Swing/AWT non sono thread-safe. garantiti, meglio trovare un'altra
soluzione.
Credo che metterò mano al codice e ci perderò un po' di tempo...
Grazie comunque a tutti!
Ciao!