获取Java编译器

如何获取java编译器?

获取java编译器可以动态编译java文件,获取方式有以下几种。

一,使用Runtime

Runtime.getRuntime().exec(“javac c://test.java”);执行cmd命令进行编译.java文件,详情请见:

https://blog.csdn.net/rico_zhou/article/details/79873344

二,通过系统方法getSystemJavaCompiler方法获取

注意,查看源码是可以发现此方法获取的还是tools.jar,但是此文件在java/jdk/lib下,需要将其复制到jdk/jre/lib下,不然返回的是null。

// 第一种,使用系统方法获取
	public static JavaCompiler getJavaCompiler1() {
		//需要把jdk/lib下的tools.jar复制到jdk/jre/lib下
		JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
		return compiler;
	}

三,从安装的jdk中获取

主要是找到tools.jar文件,读取环境变量,拼接路径,然后从中获取编译器。

	// 第二种,使用环境变量从jdk中读取
	public static JavaCompiler getJavaCompiler2() throws Exception {
		String javahome = System.getenv("JAVA_HOME");
		File file = new File(javahome + File.separator + "lib\\tools.jar");
		if (!file.exists()) {
			return null;
		}
		JavaCompiler compiler = getJavaCompilerByLocation(file);
		return compiler;
	}

	// 获取编译器
	public static JavaCompiler getJavaCompilerByLocation(File f1) throws Exception {
		String p = f1.getAbsolutePath();
		URL[] urls = new URL[] { new URL("file:/" + p) };
		URLClassLoader myClassLoader1 = new URLClassLoader(urls, Thread.currentThread().getContextClassLoader());
		Class<?> myClass1 = myClassLoader1.loadClass("com.sun.tools.javac.api.JavacTool");
		JavaCompiler compiler = myClass1.asSubclass(JavaCompiler.class).asSubclass(JavaCompiler.class).newInstance();
		return compiler;
	}

四,从指定的tools.jar获取

需要jar包tools.jar,传入路径参数,代码如下

// 第三种,任意目录下tools.jar读取
	public static JavaCompiler getJavaCompiler3(String filePath) throws Exception {
		File file = new File(filePath);
		if (!file.exists()) {
			return null;
		}
		JavaCompiler compiler = getJavaCompilerByLocation(file);
		return compiler;
	}

	// 获取编译器
	public static JavaCompiler getJavaCompilerByLocation(File f1) throws Exception {
		String p = f1.getAbsolutePath();
		URL[] urls = new URL[] { new URL("file:/" + p) };
		URLClassLoader myClassLoader1 = new URLClassLoader(urls, Thread.currentThread().getContextClassLoader());
		Class<?> myClass1 = myClassLoader1.loadClass("com.sun.tools.javac.api.JavacTool");
		JavaCompiler compiler = myClass1.asSubclass(JavaCompiler.class).asSubclass(JavaCompiler.class).newInstance();
		return compiler;
	}

归根结底,最主要的还是tools.jar文件,demo源码GitHub:https://github.com/ricozhou/getjavacompiler

猜你喜欢

转载自blog.csdn.net/rico_zhou/article/details/80725086
今日推荐