使用javac和javax.tools.JavaCompiler有什么区别?

Maven编译器插件文档说明 :

Compiler Plugin用于编译项目的源代码。 从3.0开始,默认编译器是javax.tools.JavaCompiler(如果您使用的是java 1.6)并且用于编译Java源代码。 如果要使用javac强制插件,则必须配置插件选项forceJavacCompilerUse

实际上,当我们的构建中没有指定forceJavacCompilerUse会出现一些构建错误,例如当代码引用com.sun. 包(遗产,我们知道这是一个坏主意…)

这两种编译模式与maven有什么区别? 是否应该知道任何产出差异?

javac (作为“java编译器”)是一个可执行文件,理论上甚至可以是依赖于平台的可执行文件或脚本。 这被称为将.java编译为.class

在Windows上它的名称是javac.exe ,它通常位于C:\Program Files*\jdk*\bin

这个编译器也是用java开发的。 这意味着,如果我们启动此.exe,则需要启动一个新的Java虚拟机来运行它。 这很慢。

但是,因为它是用Java编写的,所以有一个更快的替代方法:从我们已经运行的jvm,我们只需import它的主类(fe javax.tools.JavaCompiler等)并调用它。 这不需要启动不需要的jvm。 这就是maven的作用。 仅仅10年就足以让他们正确地做到这一点。 🙂

当然它也有一些后退。 最可能的原因是,在内部编译器的情况下,它需要从与maven核心相同的jvm和相同的命名空间中运行。 同样指定备用jvm是不可能的,并且可能还存在一些由命名空间冲突导致的副作用。 但它们非常不可能,因为它们都是精心设计的软件。