Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ToolProvider.getSystemJavaCompiler()在JDK 9中返回null_Java_Java 9_Javacompiler - Fatal编程技术网

ToolProvider.getSystemJavaCompiler()在JDK 9中返回null

ToolProvider.getSystemJavaCompiler()在JDK 9中返回null,java,java-9,javacompiler,Java,Java 9,Javacompiler,我在Eclipse中的项目正在使用系统JRE 9运行。当我试图将Java home设置为JDK 9以获取系统编译器时,我得到了null System.setProperty("java.home", "C:\\Program Files\\Java\\jdk-9.0.1"); System.out.println(System.getProperty("java.home")); // print C:\Program Files\Java\jdk-9.0.1 JavaCompiler comp

我在Eclipse中的项目正在使用系统JRE 9运行。当我试图将Java home设置为JDK 9以获取系统编译器时,我得到了null

System.setProperty("java.home", "C:\\Program Files\\Java\\jdk-9.0.1");
System.out.println(System.getProperty("java.home")); // print C:\Program Files\Java\jdk-9.0.1
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); // returns null
这段代码以前在JDK 8(从JRE 8运行)下运行良好

ToolProvider.getSystemJavaCompiler要求的工作方式是否有任何更改


更新:不确定这是否重要,但是如果我从JDK 9(不再需要更改为java.home)而不是JRE 9运行我的项目,getSystemJavaCompiler()可以正常工作。

相应地将Unix上的路径更改为
/Contents/home
对我来说很有效:

System.setProperty("java.home", 
                   "/Library/Java/JavaVirtualMachines/jdk-9.0.1.jdk/Contents/Home/");
虽然似乎根本不需要设置属性。由于以下代码行甚至可以独立执行,因此也可以很好地执行:

JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); 

当我的系统上的
JAVA\u HOME
设置为指向JDK9
HOME
目录时。

注意,OP是从JRE9运行代码,而不是从JRE9运行代码JDK9@ZhekaKozlov我想这有点让人困惑,因为代码读起来是
C:\\Program Files\\Java\\jdk-9.0.1
,当然单凭JRE是不行的。我说过,当我使用JRE 8启动并将
java.home
目录更改为JDK 8目录时,这是可行的。我不明白的是,这会停止对JRE9-JDK9对的工作。@使用JRE9的VDA888会将路径设置为
…jdk-9.0.1.jdk\\Contents\\Home
对您有效吗?从未指定系统属性
java.Home
与此功能有任何关联。因此,您使用的是已更改的以前Java版本的实现细节。
ToolProvider
API的全部目的是停止使用实现细节来访问编译器。你为什么要这么做?为什么不在Eclipse的启动配置中简单地指定该jdk,用该jdk运行应用程序呢?@VDA888主要是一个包含
lib/modules
的目录。不管怎样,你为什么还要像@Holger所指出的那样手动设置路径呢?在运行的VM中更改java.home系统属性是疯狂的,天知道会发生什么。我假设您的代码在JDK 8中工作的原因是javac编译器在tools.jar中,API从${java.home}/tools.jar加载它。正如在其他文章中提到的,tools.jar不再存在。如果您希望在另一个运行时映像中调用javac,那么您需要使用ProcessBuilder调用它,并在它自己的VM中启动它。
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();