Примечание. Это повторяющийся вопрос с форумов оракулов, поскольку там никто на него не ответил.
Наши приложения поставляются с JRE, а не с JDK, и в пути к классам у нас также есть tools.jar.
Из нашего приложения мы компилируем abc.java командой: com.sun.tools.javac.Main.compile(file);
Затем следующим шагом является обработка аннотаций с помощью инструмента apt, например.
args[0] = "-nocompile";
args[1]=abc.java
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int aptReturnCode = com.sun.tools.apt.Main.process(processor, new PrintWriter(baos), fl); //where processor is the custom annotation processor.
С java-8 мы обнаружили, что оракул сделал инструмент apt несуществующим, поэтому вместо использования инструмента apt мы должны использовать компилятор java для той же задачи. (Я получил этот совет от этого форума в прошлом). Итак, я пришел с кодом ниже, который нуждался в некоторой доработке процессора аннотаций, но проблема в том, что ToolProvider.getSystemJavaCompiler( )
всегда возвращает null. Есть ли способ, которым я мог бы выполнить эту обработку аннотаций или загрузить компилятор java только с tools.jar в пути к классу без использования jdk?
ArrayList<String> customClasses = new ArrayList<String>();
ArrayList<String> arguments = new ArrayList<String>();//arguments for the java compiler
arguments.add( "-proc:only" ); // only do annotations processing and do not compile the source code.
customClasses.add("full path/abc.java");
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); // always returns null
ByteArrayOutputStream baos = new ByteArrayOutputStream();
DiagnosticCollector<JavaFileObject> diagnostics = new DiagnosticCollector<JavaFileObject>();
StandardJavaFileManager fileManager = compiler.getStandardFileManager(diagnostics, null, null);
Iterable<? extends JavaFileObject> compilationUnits = fileManager.getJavaFileObjectsFromStrings(customClasses);
JavaCompiler.CompilationTask task =
compiler.getTask(new PrintWriter(baos), fileManager, diagnostics, arguments, null, compilationUnits);
ArrayList<Processor> processors = new ArrayList<Processor>();
processors.add( new MyCustomProcessor() );
task.setProcessors( processors );
boolean success = task.call();
Огромное спасибо
tools.jar
для Java 8 в вашем пути к классам, чтобы она работала. Но имейте в виду, что это снова сломается, как только вы переключитесь на Java 9, так как тогдаtools.jar
больше не будет (если все развернуто, как планировалось). Итак, суть в том, что если вам нужен компилятор, вам нужен JDK (если только у вас нет собственного собственного компилятора). - person Holger   schedule 18.03.2015-Xbootclasspath/a:path/to/tools.jar
- person Holger   schedule 18.03.2015