Проблема в том, что сгенерированный код импортирует код, который уже был загружен загрузчиком системных классов (я полагаю), то есть код, присутствующий в одном из jar-файлов моего пути к классам.
(Я запускаю внутри Веб-контейнер Tomcat 6 поверх Java 6.) Вы можете спросить себя, почему это проблема — ну Я точно не знаю — но факт в том, что я получаю ошибки компиляции:
/W:/.../parser/v0.5/AssignELParser.java:6:
пакет com.xxx.yyy.zzz.configuration не существует
Используя несколько примеров из Интернета, я определил следующие классы:
Код: Выделить всё
class MemoryClassLoader extends ChainedAction {
private static final Logger LOG = Logger.getLogger(MemoryClassLoader.class);
private LoaderImpl impl;
private class LoaderImpl extends ClassLoader {
// The compiler tool
private final JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
// Compiler options
private final Iterable options = Arrays.asList("-verbose");
// DiagnosticCollector, for collecting compilation problems
private final DiagnosticCollector diagnostics = new DiagnosticCollector();
// Our FileManager
private final MemoryFileManager manager = new MemoryFileManager(this.compiler);
public LoaderImpl(File sourceDirectory) {
List list = new ArrayList();
File[] files = sourceDirectory.listFiles(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
return name.endsWith(Kind.SOURCE.extension);
}
});
for (File file : files) {
list.add(new Source(file));
}
CompilationTask task = compiler.getTask(null, manager, diagnostics, options, null, list);
Boolean compilationSuccessful = task.call();
LOG.info("Compilation has " + ((compilationSuccessful) ? "concluded successfully" : "failed"));
// report on all errors to screen
for (Diagnostic
Подробнее здесь: [url]https://stackoverflow.com/questions/1642606/java-classloader-and-runtime-compilation[/url]