從1.6版本的JDK開始,JDK提供了標准的包可以方便的調用JVM的編譯器,可以方便的使用JVM的編譯器來編譯java源文件。JDK提供的調用接口是JavaCompiler類,該類在JDK的tools.jar包中。
1、使用JavaCompiler接口實現java文件編譯
String sOutputPath = "D:\\classes"; List<String> paths = new ArrayList<String>(); paths.add("D:\\java\\Test1.java"); paths.add("D:\\java\\Test2.java"); paths.add("D:\\java\\Test3.java"); paths.add("D:\\java\\Test4.java"); paths.add("D:\\java\\Test5.java"); paths.add("D:\\java\\Test6.java"); JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); DiagnosticCollector<JavaFileObject> diagnostics = new DiagnosticCollector<JavaFileObject>(); StandardJavaFileManager fileManager = compiler.getStandardFileManager( diagnostics, null, null); Location oLocation = StandardLocation.CLASS_OUTPUT; fileManager.setLocation(oLocation, Arrays.asList(new File[] { new File(sOutputPath) })); Iterable<? extends JavaFileObject> compilationUnits = fileManager .getJavaFileObjectsFromStrings(paths); JavaCompiler.CompilationTask task = compiler.getTask(null, fileManager, diagnostics, null, null, compilationUnits); boolean result = task.call(); fileManager.close();
2、前面提到tools.jar是JDK提供的包,而當在IDE中運行實例時,由於IDE一般配置的JRE是獨立的JRE,因此在獲取JavaCompiler時將獲取不到JVM提供的編譯器(獲取方法:JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();),所以會報出NullPointerException。解決方法是修改IDE的JRE路徑,修改成JDK中的JRE路徑,Windows->Preferences->Java->Installed JREs選擇右側表格中的JRE,然后進行編輯,將JRE的路徑修改成%JAVA_HOME%/jre路徑,這樣再運行就不會再報出空指針異常了。