ToolProvider.getSystemJavaCompiler() return null 的解决方法

【1】利用java 编译器API 编译 普通的java文件

1.1)代码如下:

package com.corejava.chapter10_2;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.OutputStream;

import javax.tools.JavaCompiler;
import javax.tools.ToolProvider;

public class JavaCompilerTest
{
	public static void main(String[] args) throws FileNotFoundException
	{
		JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
		OutputStream out = new FileOutputStream("out.txt");
		OutputStream err = new FileOutputStream("err.txt");
		System.out.println(compiler);
		System.out.println(System.getProperty("java.home"));
		int result = compiler.run(null, out, err, "com/corejava/chapter10_2/Hello.java");
		if(result == 0)
		{
			System.out.println("bingo");
		}
		else
		{
			System.out.println("oops");
		}
	}
}
1.2)错误如下(null 指针异常):


-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------

【2】 解决方法

2.1)通过  System.out.println(System.getProperty("java.home")); ,我们知道了 java.home ==  C:\Program Files\Java\jre1.8.0_60 ; 

引用 http://www.cnblogs.com/fangwenyu/archive/2011/10/12/2209051.html  中的解决方法,通过查看 ToolProvider 的源代码,我们知道 他需要查找 java.home 下面的 lib 里的 tools.jar 文件, 而 tools.jar 文件通常在 jdk/lib 文件夹而没有在 jre中, 所以,我们只需要把 tools.jar 复制到 你的java.home映射目录/lib/ 就可以了;

2.2)复制 tools.jar 到 C:\Program Files\Java\jre1.8.0_60\lib(java.home == C:\Program Files\Java\jre1.8.0_60\)中后,运行结果为:



【3】 Conclusion

C1)需要知道 jvm 中的 java.home 映射的目录是什么? 不要瞎copy;

C2)知道 java.home后,就将 tool.jar copy 到 其路径下面 的 lib 文件夹中;


Java中的`javax.tools.StandardJavaFileManager`和`javax.tools.JavaFileObject`是用于处理Java源代码文件的接口和类。它们提供了一种标准的方式来读取、写入和管理Java源代码文件。 ### `JavaFileObject` `JavaFileObject`是一个接口,用于表示Java源代码文件或编译后的类文件。它提供了一些方法来获取文件的名称、内容以及修改时间等信息。通过实现这个接口,可以自定义文件对象的读取和写入行为。 ### `StandardJavaFileManager` `StandardJavaFileManager`是一个接口,用于管理一组`JavaFileObject`对象。它提供了一些方法来获取文件对象、设置编译选项以及处理编译后的输出文件。通过实现这个接口,可以自定义文件管理器的行为。 ### 常见问题 1. **如何创建自定义的`JavaFileObject`?** 你可以通过实现`JavaFileObject`接口,并提供自定义的读取和写入方法。例如: ```java public class CustomJavaFileObject extends SimpleJavaFileObject { private String content; public CustomJavaFileObject(URI uri, Kind kind) { super(uri, kind); } public void setContent(String content) { this.content = content; } @Override public CharSequence getCharContent(boolean ignoreEncodingErrors) throws IOException { return content; } } ``` 2. **如何使用`StandardJavaFileManager`来编译Java源代码文件?** 你可以使用`JavaCompiler`类来获取`StandardJavaFileManager`,并使用它来编译源代码文件。例如: ```java JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null); Iterable<? extends JavaFileObject> compilationUnits = fileManager.getJavaFileObjectsFromStrings(Arrays.asList("HelloWorld.java")); compiler.getTask(null, fileManager, null, null, null, compilationUnits).call(); fileManager.close(); ``` 3. **如何处理编译后的输出文件?** 你可以使用`StandardJavaFileManager`的方法来设置输出目录。例如: ```java fileManager.setLocation(StandardLocation.CLASS_OUTPUT, Arrays.asList(new File("bin"))); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值