Deseo compilar fuente sin tener las dependencias presentes en la máquina.
Ejemplo: Archivo A.java:
JavaCompiler con ClassLoader y FileManager personalizados
import some.pkg.B;
public class A extends B {...}
no tengo la fuente B presente, deseo de conectar ya sea JavaFileManager o un cargador de clases personalizada con el fin de obtener los símbolos en cuestión (el paquete 'algunos. paquete 'y clase B) y luego use un servicio que tengo que recupera la cadena fuente.
El código de compilación: (inputFiles tiene 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();
Los ganchos en JavaFileManager (getFileForInput ..) y en mi cargador de clases (FindClass, loadClass ..) no se activan al compilar y yo tiene mensajes de error:
A.java:#: package some.pkg does not exist
A.java:#: cannot find symbol
symbol: class B
EDIT
Después de jugar un poco con el API, repasando JavaCompiler (versión antigua) s piénsalo y lee Compilation Overview Aún no puedo encontrar un enlace API que pueda usar para proporcionarme Símbolos de los árboles de sintaxis. Parece que la API necesita obtener todos los recursos en función de los nombres de los paquetes sugeridos por kschneid.
Una solución temporal en la que pensé es ejecutar JavaCompiler y analizar los mensajes de error en busca de símbolos faltantes. De esa manera sabré qué símbolos son necesarios, consíguelos y recompile.
¿Alguna otra solución alternativa?
Qué versión de JDK/compilador y la plataforma está usando? – matts
JavaCompiler (javac), JDK 1.6.30 x64 en Windows. –
No estoy del todo seguro. Pero, siento como si lo que intentas hacer es una carga dinámica de clases. ¿No puedes usar 'Class.forname()' para cargar la clase en tiempo de ejecución. Por favor corrígeme si malentendí. – Ankit