ToolProvider.getSystemJavaCompiler()与jre + tools.jar

时间:2015-03-18 15:56:30

标签: annotations java-8

注意:这是来自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();

非常感谢

1 个答案:

答案 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