2010-03-05 13 views
5

Sto facendo uno strumento Java Record/Replay e ho bisogno di avviare le applicazioni Java dalla mia app Java principale. Ho bisogno di accedere al EventDispatchThread al fine di intercettare gli eventi e li registra, quindi sto avviando l'applicazione attraverso la riflessione con (frammento di codice semplificato):Avviare un'applicazione java da un'altra applicazione java

Class<?> app = Class.forName(mainClass); 
Method m = app.getMethod("main", new Class[] { String[].class }); 
m.invoke(null, new Object[] { new String[] {} }); 

ho già caricare dinamicamente tutti i vasi al classpath e l'applicazione si avvia quasi perfettamente.

Il problema si verifica quando l'applicazione deve accedere a qualsiasi file e lo fa con percorsi relativi. Poiché l'applicazione viene avviata attraverso la mia applicazione, il percorso non è uguale a quello lanciato dal suo percorso normale e i file non vengono trovati.

Cosa posso fare per risolvere questo problema? cambia dinamicamente l'ambiente di esecuzione? qualche idea?

risposta

2

Suggerisco di caricare il codice come "Agente Java" mentre si avvia l'applicazione di destinazione.

(Con il metodo troverete anche che il caricatore di classe del sistema è sbagliato.)

+0

Vado a controllare come eseguire il codice come un "agente Java" e che cosa esattamente si intende. Non ho capito la tua parentesi, però ... – jpsstavares

0

In generale, non c'è modo per fare questo.

http://bugs.sun.com/bugdatabase/view_bug.do;jsessionid=30b24551130ee4ffffffffc17df8d7ce8a9c3?bug_id=4117557

Si può provare System.setProperty("user.dir", "C:\\Some\\Location"); ma probabilmente non funzionerà per tutti i casi e vi darà un comportamento strano.

È un design piuttosto scadente per un'app fare affidamento sulla directory da cui è stata avviata.

Il miglior consiglio che posso darti è quello di lanciare la tua app dalla directory da cui si aspetta che l'applicazione anomala si avvii (assumendo che tu sappia cos'è quella directory).

In caso contrario, l'inferno, copia/link simbolico i file di dati nella directory in modo che l'applicazione client può trovarli ...

Problemi correlati