ToolProvider.getSystemJavaCompiler() 返回 null的问题_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > ToolProvider.getSystemJavaCompiler() 返回 null的问题

ToolProvider.getSystemJavaCompiler() 返回 null的问题

 2014/5/6 15:30:44  liu578182160  程序员俱乐部  我要评论(0)
  • 摘要:最近做一个项目,用到了ToolProvider.getSystemJavaCompiler()编译Java类出现一个奇怪的现象:在EclipseIDE中测试完全没有问题,部署到Web服务器中从前台界面跑起来,就会卡着不动,也没有报错,跟踪了一下,找到ToolProvider.getSystemJavaCompiler()为null上网搜了下,直接说就是找不到jdklib目录下tools.jar文件,没法编译之前我设置JAVA_HOME在java\jdk更改为Java\jre
  • 标签:system ide Java 问题

最近做一个项目,用到了ToolProvider.getSystemJavaCompiler()编译Java类

出现一个奇怪的现象:在Eclipse IDE中测试完全没有问题,部署到Web 服务器中从前台界面跑起来,就会卡着不动,也没有报错,跟踪了一下,找到ToolProvider.getSystemJavaCompiler()为null

?

上网搜了下,直接说就是找不到jdk lib目录下tools.jar文件,没法编译

之前我设置JAVA_HOME在java\jdk
更改为Java\jre,同时将jdk\lib下将tools.jar复制到jre\lib下

OK

编译通过

?

工程可以正常运行了,现在回过头来,研究下为什么要这样做呢

查看ToolProvider的源码,发现这段代码

?
    class="dp-j" style="border: none; background-color: #ffffff; color: #5c5c5c; margin-bottom: 1px !important; margin-left: 45px !important;">
  1. private?static?final?String[]?defaultToolsLocation??
  2. ????????????=?{?"lib",?"tools.jar"?};??
  3. private?static?Class<?>?findClass()??
  4. ????????????throws?MalformedURLException,?ClassNotFoundException??
  5. ????????{??
  6. ????????????try?{??
  7. ????????????????return?enableAsserts(Class.forName(defaultJavaCompilerName,?false,?null));??
  8. ????????????}?catch?(ClassNotFoundException?e)?{??
  9. ????????????????//?ignored,?try?looking?else?where??
  10. ????????????}??
  11. ????????????File?file?=?new?File(System.getProperty("java.home"));??
  12. ????????????if?(file.getName().equalsIgnoreCase("jre"))??
  13. ????????????????file?=?file.getParentFile();??
  14. ????????????for?(String?name?:?defaultToolsLocation)??
  15. ????????????????file?=?new?File(file,?name);??
  16. ????????????URL[]?urls?=?{file.toURI().toURL()};??
  17. ????????????ClassLoader?cl?=?URLClassLoader.newInstance(urls);??
  18. ????????????cl.setPackageAssertionStatus("com.sun.tools.javac",?true);??
  19. ????????????return?Class.forName(defaultJavaCompilerName,?false,?cl);??
  20. ????????}??

它编译文件时,会找到JAVA_HOME的jre\lib\tools.jar

?

但是值得注意的是tools.jar并不在jre中,它是在jdk的安装目录下

所以,手动把这个jar文件从jdk目录下拷贝到了jre目录下,再次运行上面的代码就没有问题了!

发表评论
用户名: 匿名