1、在java程序中用JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();来获取编译器时,返回的值为NULL,经过在网上查找资料,都是jre惹的祸,
我们在装java环境时,通常会装两个,一个是jdk,一个是jre,其目录形式如下:
C:\Java-->jdk1.6.0_25
-->jre6
但是我们在eclipse或者myeclipse中开发应用程序的时候用到的是C:\Java-->jre6,但是这个下面没有编译器
在C:\Java-->jdk1.6.0_25目录下有一个jre文件夹,其内容和C:\Java-->jre6是一样的
此时我们把eclipse或者myeclipse中的jre换成C:\Java-->jdk1.6.0_25-->jre这个jre
在更改成功之后,会重新编译工程,在编译成功之后,运行程序,就可以获取到动态编译器了
2、
ToolProvider的源代码有如下一段:
private static final String[] defaultToolsLocation = { "lib", "tools.jar" };
privatestatic Class<?> findClass() throws MalformedURLException, ClassNotFoundException { try { return enableAsserts(Class.forName(defaultJavaCompilerName, false, null)); } catch (ClassNotFoundException e) { // ignored, try looking else where } File file = new File(System.getProperty("java.home")); if (file.getName().equalsIgnoreCase("jre")) file = file.getParentFile(); for (String name : defaultToolsLocation) file = new File(file, name); URL[] urls = {file.toURI().toURL()}; ClassLoader cl = URLClassLoader.newInstance(urls); cl.setPackageAssertionStatus("com.sun.tools.javac", true); return Class.forName(defaultJavaCompilerName, false, cl); }