Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.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
jar中的Java编译器_Java_Compiler Construction_Jar - Fatal编程技术网

jar中的Java编译器

jar中的Java编译器,java,compiler-construction,jar,Java,Compiler Construction,Jar,当从jar文件调用时,我的JavaCompiler返回一个空指针 若我从命令行用JavaCompiler运行我的程序,一切都很好。 因此,JDK已正确安装在我的操作系统上 为什么不起作用 代码: JavaCompiler compiler=ToolProvider.getSystemJavaCompiler(); StandardJavaFileManager fileManager=compiler.getStandardFileManager(null,null,null); Iterabl

当从jar文件调用时,我的JavaCompiler返回一个空指针

若我从命令行用JavaCompiler运行我的程序,一切都很好。 因此,JDK已正确安装在我的操作系统上

为什么不起作用

代码:

JavaCompiler compiler=ToolProvider.getSystemJavaCompiler();
StandardJavaFileManager fileManager=compiler.getStandardFileManager(null,null,null);
Iterable options=Arrays.asList(新字符串[]{“-d”,currentDir+“/cache/”,“-sourcepath”,currentDir+“/srcss/”});

Iterable您需要确保在作为jar启动应用程序时使用相同的运行时

当作为独立应用程序启动它时,您可能正在使用一些基本JRE安装中的
rt.jar
,而当您在IDE中执行它时,您很可能正在使用JDK中的
rt.jar


您可以执行
System.out.println(System.getProperty(“java.home”)
来调试它。

如果这是您自己的部署(到您自己的机器上),可以通过将SDK的
tools.jar
显式添加到应用程序的运行时类路径(例如,在清单中提及)来解决问题


其他的策略可以在地图上看到(或者至少暗示)。如果你需要更多信息。关于这些,请告诉我。

根据我的理解,JavaCompiler=ToolProvider.getSystemJavaCompiler();仅当java编译器的句柄在和JDK发行版下执行时,才将其返回给java编译器


如果您在JRE下使用它(通常我们只在JRE下执行),它将返回null,请确认我们是从JDK调用它,或者它包含适当的jar文件,但我的系统设置为JDK。当我从命令行启动程序时,它从JDK启动。如何将jar设置为JDK?在应用程序中打印
System.getProperty(“java.home”)
返回的字符串,看看它是否不同。
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null);
Iterable<String> options = Arrays.asList( new String[] { "-d", currentDir+"/cache/","-sourcepath",currentDir+"/srcss/"} );
Iterable<? extends JavaFileObject> compUnits =  fileManager.getJavaFileObjects(fRun);
Boolean compRes = compiler.getTask(null, fileManager, null, options, null, compUnits).call();