Я набрал код, который генерирует два класса, которые я пишу их в буфер и компилирую их с помощью JavaCompiler. Мои классы похожи на мои .java-файлы;JavaCompiler дает ошибку при создании зависимого класса
public class A{
public A() { }
public String toString(){ return "A";}
}
и
public class B extends ArrayList<A> {
public B() {
super();
}
public void addItem(A a)
{
this.add(a);
}
public void print() {
this.print();
}
}
что-то вроде этого.
Однако имена классов генерируются случайным образом, и когда я создаю файл, он дает такую ошибку;
symbol: class A
location: class B
./src/A.java:4: error: cannot find symbol
(4-я строка является "... проходит ArrayList ..." и есть символ^в А)
Мой генератор код компилируется как это;
Сначала я заполнить буфер с моим шаблоном для классов типов затем скомпилировать, как это:
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
compiler.run(null, null, null, f.getPath());
после этого я создаю еще один буфер и заполнить его с моим шаблоном для классов типа B затем скомпилировать, как это;
System.out.println(f.getParentFile().getPath());
compiler.run(null, null, null, f.getPath());
f is;
f = new File(("./src/" + name + ".java"));
Как я могу решить эту проблему?
Как вы компилируете классы 'A' и' B'? Компилятор java должен знать о классе 'A', когда компилируется класс' B'. – SubOptimal
Возможно, ваш код компиляции прав, и вы пропустите в 'B.java' только оператор' import java.util.ArrayList; '. – SubOptimal
Вместо вызова 'JavaCompiler # run' (который фактически является' Tool # run'), возможно, вам придется создать специальную задачу компиляции с помощью [JavaCompiler # getTask] (https://docs.oracle.com/javase/8 /docs/api/javax/tools/JavaCompiler.html#getTask-java.io.Writer-javax.tools.JavaFileManager-javax.tools.DiagnosticListener-java.lang.Iterable-java.lang.Iterable-java.lang.Iterable -): он позволяет вам добавлять информацию, необходимую для компиляции, в частности, ** компиляционные единицы **. Также см. Http://stackoverflow.com/a/30038318/3182664 (но он также может работать с некоторыми ручными 'classpath' fiddling) – Marco13