Путь к классу должен называть папку, содержащую Example2.class
, а не само имя файла, поэтому измените второе tag.add(...)
на tag.add("resources")
.
Вам нужно вызвать task.call()
, чтобы фактически выполнить компилятор , Затем компилятор поместит файл Example1.class
рядом с файлом Example1.java
.
Чтобы запустить класс, вам нужно настроить ClassLoader
с папкой resources
в пути к классам, а затем использовать отражение чтобы получить класс Example1
и его метод main
.
StandardJavaFileManager
и URLClassLoader
оба являются ресурсами , поэтому вы должны использовать try-with-resources для их корректного закрытия. когда вы закончите с ними.
Вот рабочий код:
JavaCompiler jc = ToolProvider.getSystemJavaCompiler();
DiagnosticCollector<JavaFileObject> d = new DiagnosticCollector<>();
try (StandardJavaFileManager fm = jc.getStandardFileManager(d, null, null)) {
List<String> tag = new ArrayList<>();
tag.add("-classpath");
tag.add("resources");
File file = new File(EXAMPLE1);
Iterable<? extends JavaFileObject> cu = fm.getJavaFileObjectsFromFiles(Arrays.asList(file));
JavaCompiler.CompilationTask task = jc.getTask(null, fm, null, tag, null, cu);
if (! task.call())
throw new IllegalStateException("compilation failed");
}
try (URLClassLoader classLoader = URLClassLoader.newInstance(new URL[] { new File("resources").toURI().toURL() })) {
Class<?> example1Class = Class.forName("Example1", true, classLoader);
Method mainMethod = example1Class.getMethod("main", String[].class);
if (! Modifier.isStatic(mainMethod.getModifiers()))
throw new IllegalStateException("main method is not static");
mainMethod.invoke(null, (Object) new String[0]);
}
Если в Example1.java
есть ошибка, вы получите STDERR-вывод, подобный этому:
resources\Example1.java:3: error: cannot find symbol
xExample2 ex2 = new Example2(1, 2);
^
symbol: class xExample2
location: class Example1
1 error
Exception in thread "main" java.lang.IllegalStateException: compilation failed
at Test.main(Test.java:32)
Если класс компилируется и имеет правильное имя и метод, вывод STDOUT будет:
x : 1, y : 2
sum : 3
mult : 2