注意:这是来自oracle论坛的重复问题,因为没有人在那里回答。
我们的应用程序附带了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,我们发现oracle已经使apt工具失效,所以我们应该使用java编译器来执行相同的任务而不是使用apt工具。(我在过去的这个论坛中得到了这个提示)所以我想出了下面的代码,需要对注释处理器进行一些修改,但问题是ToolProvider.getSystemJavaCompiler( )
总是返回null。有没有办法可以在不使用jdk的情况下使用类路径中的tools.jar进行此注释处理或加载java编译器?
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();
非常感谢
答案 0 :(得分:0)
在Windows上设置eclipse,我有一个使用mapstruct的项目。我只想指出,如果您在maven控制台日志中看到此错误
[ERROR] JVM不适合处理注释! ToolProvider.getSystemJavaCompiler()为null。
一个修复将是
安装java jdk,打开eclipse.ini并在-vmargs上面添加以下行
-vm
C:\Program Files\Java\jdk1.8.0_111\bin\javaw.exe
-vmargs