`

ToolProvider.getSystemJavaCompiler() 返回 null的问题

阅读更多

最近做一个项目,用到了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的源码,发现这段代码

 
  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, falsenull));  
  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目录下,再次运行上面的代码就没有问题了!

分享到:
评论

相关推荐

    修复win10闪退 null.sys null.zip

    标题 "修复win10闪退 null.sys" 描述的是一个针对Windows 10系统中Git闪退问题的解决方案。在Windows 10操作系统中,有时用户可能会遇到Git客户端或者其他应用程序因null.sys驱动程序问题而异常退出的情况。这个问题...

    java深度历险.pdf

    JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null); Iterable&lt;? extends JavaFileObject&gt; ...

    JMF 的CaptureDeviceManager.getDeviceList(null)获取不到设备列表,返回值为空

    JMF 的CaptureDeviceManager.getDeviceList(null)获取不到设备列表,返回值为空,的解决方法;

    null.sys 修复Git异常

    "null.sys 修复Git异常"这个主题涉及到的是在使用Git时遇到的一种特定问题,即系统文件null.sys可能与Git的正常运行产生了冲突,导致了异常。下面我们将深入探讨这个问题,以及如何进行修复。 首先,我们需要理解...

    StringUtils

    如果字符串为 `null`,则返回 `null`。 **示例:** ```java System.out.println(StringUtils.trim(null)); // 输出 null System.out.println(StringUtils.trim("")); // 输出 "" System.out.println(StringUtils....

    Imagevue.v2.8.9.PHP.NULL-DGT

    Imagevue.v2.8.9.PHP.NULL-DGT

    Java深度历险

    接着,我们使用`ToolProvider.getSystemJavaCompiler()`方法获取系统默认的Java编译器实例。然后,通过`JavaCompiler`接口提供的方法,我们创建了一个`StandardJavaFileManager`对象,并使用自定义的`...

    win10专业版 null.sys

    Git for Windows提供了一个名为`null.sys`的设备驱动来实现类似的功能。当在安装或使用Git时遇到找不到`null.sys`的错误,可能是以下几个原因: 1. **缺少Git for Windows组件**:确保你下载并安装了完整的Git for ...

    sys_null.rar_null.sys

    在系统移植时,如果目标平台缺少特定的硬件驱动,但该驱动在源平台上是必需的,"null.sys" 可以作为一个临时替代品,避免因缺少驱动而导致的编译错误或运行时问题。它通常不执行任何实际的硬件操作,而是简单地接收...

    系统文件 null.sys

    刚开始的时候git是可以用的,不知道操作了什么突然无法再使用git,一直报如下的错误 : ...在一台正常可以使用的电脑上拷贝c:\Windows\system32\drives\null.sys文件,复制到有问题的电脑相同的位置

    java代码的方式对java源码进行编译并打包成jar

    StandardJavaFileManager fileManager = ToolProvider.getSystemJavaCompiler().getStandardFileManager(null, null, null); Iterable&lt;? extends JavaFileObject&gt; sources = fileManager....

    java.sql.SQLException: null,  message from server: “Host ‘%’ is not allowed to connect to

    java.sql.SQLException: null, message from server: “Host ‘223.72.41.7’ is not allowed to connect to this MySQL server” 客户端访问时报错: 解决方法: 1,登陆服务器 mysql&gt; use mysql; //用mysql ...

    TypeError document.getElementById(...) is null错误原因

    这个错误表示`document.getElementById`方法未能找到匹配给定ID的元素,因此返回`null`,而当你尝试调用`null`上的任何属性或方法时,JavaScript会抛出此类型错误。 ### 错误原因 1. **元素未加载**:在使用`...

    vBulletin.v3.0.17.incl.KeyGen.PHP.NULL-DGT.zip

    vBulletin.v3.0.17.incl.KeyGen.PHP.NULL-DGT.zip

    Invision.Power.Board.v2.1.7.PHP.NULL-DGT

    Invision.Power.Board.v2.1.7.PHP.NULL-DGT

    net.sf.json.JSONObject 为null 的判断方法

    当尝试从一个无效的JSON字符串(如"123")创建一个`JSONObject`时,`JSONObject.fromObject()`方法并不会返回`null`,而是返回一个非空的`JSONObject`。因此,上述代码中的`if`条件永远不会满足,即使JSON对象实际上...

    WowBB.v1.62.PHP.NULL-LOGiC

    WowBB.v1.62.PHP.NULL-LOGiC 非常不错的一款老外的PHP论坛程序。

    COPPER.2004.v2.5.Corporate.PHP.NULL.Incl.Keygen-WDYL

    COPPER.2004.v2.5.Corporate.PHP.NULL.Incl.Keygen-WDYLPHP源程序,用于在线的项目管理与协作

    PHPCart.v3.1.2.PHP.NULL-WDYL

    PHPCart.v3.1.2.PHP.NULL-WDYLPHP源代码,电子购物程序【http://www.phpcart.co.uk/】

Global site tag (gtag.js) - Google Analytics