Взгляните на javax.tools.JavaCompiler
.
Интерфейс для вызова компиляторов языка программирования Java ™ из программ.
Компилятор может генерировать диагностику во время компиляции (например, сообщения об ошибках). Если имеется диагностический слушатель, диагностика будет предоставлена слушателю. Если прослушиватель не предоставлен, диагностика будет отформатирована в неопределенном формате и записана в вывод по умолчанию, который является System.err, если не указано иное. Даже если имеется диагностический прослушиватель, некоторые диагностические данные могут не вписываться в диагностику и будут записаны в вывод по умолчанию.
Вот небольшой фрагмент кода, который я недавно использовал:
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
StandardJavaFileManager fileManager =
compiler.getStandardFileManager(null, null, null);
fileManager.setLocation(StandardLocation.CLASS_OUTPUT, compileDirList);
Iterable<? extends JavaFileObject> compilationUnits =
fileManager.getJavaFileObjectsFromFiles(files);
List<String> opts = new ArrayList<String>();
// set compiler's classpath to be same as the runtime's
opts.addAll(Arrays.asList("-classpath", System.getProperty("java.class.path")));
// do the actual compilation
compiler.getTask(null, fileManager, null, opts, null, compilationUnits).call();