问题出现及其编译环境
编写工具是Eclipse IDE for Java Developers - 2020-03
想要实现动态编译一个简单的java文件
java的运行环境是jre,而我们安装jdk1.8的时候,同时安装一个jdk1.8.0_191和一个jre1.8.0_221,而在前者文件夹内还有一个jre文件夹,其内容和后者一样。
通过在elipse编辑页面中的Window–>preferences–>Java–>Installed JREs中可以看到。默认的runtime environment是jre1.8.0-221,这是因为我们在开发程序的时候需要用到jdk1.8.0_191–jre,而在只运行java程序的时候,使用的是jre1.8.0-221。后者没有相应的编译所需要的javac.exe。
如下:
所以在运行以下程序的时候会出现NullPointException,通过debug观察发现返回值是null,也就是没有javac.exe
以下是运行的程序:
import javax.tools.JavaCompiler;
import javax.tools.ToolProvider;
public class demo01 {
public static void main(String[] args) {
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
int result = compiler.run(null, null, null, "d:/School/Hello world/HelloWorld.java");
System.out.println(result==0?"编译成功":"编译失败");
}
}
解决方法
知道了缘故,便知道了解决方法。
首先在**elipse-->window-->peferences-->java-->installed JREs**中观察到只有一个jre1.8.0_191,因此,**search-->**找到jdk1.8.0_221中的jre,添加jre,变成为如下:
可勾选也可不勾选,看心情的选择。是吧
然后再次run,发现依旧NullPointException,神奇吧
然后在项目下的JRE System Library会发现是javaSE-1.8
右键单击–>properties(or Alt+Enter)
选中第二个alternate JRE(自带翻译:备用JRE or 交替JRE):改成我们添加进去的jre,在运行就ok了
当然,也可以在这里添加那个jre,点击Alternate JRE后的Installed JREs,会进入到相同的页面进行添加。
扩展:
可以不选择第二行的alternate LRE,改选择第三个Workspace default JRE,这个地方的内容是会随着你所勾选的jre内容改变的,如果你把installed JREs中勾选jre之后,效果一样。
不过还是喜欢第二个,alternate JRE,然后勾选,jre1.8.0_221, run起来依旧没问题。但区别不大。看心情吧。
参考:
http://blog.sina.com.cn/s/blog_544c72960102w235.html
这里面介绍的是1.6版本的这个问题,那时候可能更改installed JREs之后选中,默认的就是那个Workspace default JRE,所以会直接改变,解决问题。思路right,版本没跟上。写的内容扩展了其他,推荐观看,知旧懂新。