Как обеспечить интерфейс для JavaCompiler при динамической компиляции исходного файла? - PullRequest
7 голосов
/ 10 августа 2010

Я пытаюсь скомпилировать и загрузить класс во время выполнения, не зная пакета класса. Я знаю, что класс должен соответствовать интерфейсу и местоположению источника (и, следовательно, имени класса). Я пытаюсь следующее:

/* Compiling source */
File root = new File("scripts");
File sourceFile = new File(root, "Test.java");
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
compiler.run(null, null, null, sourceFile.getPath());

где файл Test.java выглядит примерно так:

import foo.Itest;
public class Test implements Itest{
...
}

И я получаю ошибку cannot find symbol symbol : class Itest от компилятора. Как мне предоставить компилятору интерфейс (который уже был загружен), чтобы избежать этой ошибки?

[РЕДАКТИРОВАТЬ - РАЗРЕШЕНО]: Ошибка возникла из-за того, что интерфейс был ITest, а источник ссылался на Itest интерфейс.

Ответы [ 3 ]

2 голосов
/ 10 августа 2010

Кажется вероятным, что compiler.run() работает извне и требует установки пути к классам. Вы пытались передать ему подходящую настройку пути к классу, используя последний параметр args для вызова run()? Возможно, поэтому ToolProvider.getSystemToolClassLoader().

Этот пост stackoverflow также может помочь вам.

1 голос
/ 10 августа 2010

Не уверен, что это то, что вы ищете, но, как упоминалось в @Phil здесь , вы можете попытаться передать аргумент classpath в вашем методе compiler.run.

0 голосов
/ 10 августа 2010

Рассматривали ли вы создание своего класса с javassist или что-то в этом роде?

...