Desidero compilare la sorgente senza avere le dipendenze presenti sulla macchina.
esempio: file A.java:
JavaCompiler con ClassLoader e FileManager personalizzati
import some.pkg.B;
public class A extends B {...}
non ho fonte B presenti, desidero agganciare sia JavaFileManager o un ClassLoader personalizzato al fine di ottenere i simboli in questione (il pacchetto 'un po'. pacchetto 'e classe B) e quindi utilizzare un servizio che ho che recupera la stringa di origine.
Il codice di compilazione: (inputFiles ha A.java)
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
CustomClassLoader classLoader = new CustomClassLoader();
StandardJavaFileManager standardfileManager = compiler.getStandardFileManager(this, null, null);
JavaFileManager fileManager = new CustomFileManager(standardfileManager, output, classLoader);
CompilationTask task = compiler.getTask(null, fileManager, this, null, null, inputFiles);
boolean result = task.call();
Ganci su JavaFileManager (getFileForInput ..) e sul mio programma di caricamento classe (findClass, loadClass ..) non si attivano durante la compilazione ed io ottenuto messaggi di errore:
A.java:#: package some.pkg does not exist
A.java:#: cannot find symbol
symbol: class B
EDIT
Dopo aver suonato in giro con l'API, andando oltre JavaCompiler (vecchia versione) s ource and reading Compilation Overview Non riesco ancora a trovare un hook API che posso usare per fornirmi i simboli dagli alberi di sintassi. Sembra che l'API abbia bisogno di ottenere tutte le risorse basate sui nomi dei pacchetti come suggerito da kschneid.
Una soluzione a cui ho pensato è eseguire JavaCompiler e analizzare i messaggi di errore per i simboli mancanti. In questo modo saprò quali simboli sono necessari, li prendo e ricompilare.
Eventuali altri accorgimenti/soluzioni?
Che JDK versione/compilatore e la piattaforma stai usando? – matts
JavaCompiler (javac), JDK 1.6.30 x64 su Windows. –
Non ne sono completamente sicuro. Ma, mi sento come se quello che stai cercando di fare è il caricamento dinamico della classe. Non puoi usare 'Class.forname()' per caricare la classe in fase di runtime. Per favore correggimi se ho frainteso. – Ankit