Java-загрузчик классов и компиляция среды выполненияJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Java-загрузчик классов и компиляция среды выполнения

Сообщение Anonymous »

Несмотря на предупреждения о необходимости отказаться от моих нынешних действий, в настоящее время я не вижу лучшего способа решить мою проблему. Я должен генерировать код Java во время выполнения, затем скомпилировать его, загрузить и ссылаться на него.

Проблема в том, что сгенерированный код импортирует код, который уже был загружен загрузчиком системных классов (я полагаю), то есть код, присутствующий в одном из 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]
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»