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

Vic*_*Vic 34 java jvm javac maven java-compiler-api

Maven编译器插件文档说明:

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

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

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

pet*_*ica 17

javac(作为"java编译器")是一个可执行文件,理论上甚至可以是依赖于平台的可执行文件或脚本.这被称为编译a .java到a .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是不可能的,并且可能还存在一些由命名空间冲突引起的副作用.但它们非常不可能,因为它们都是精心设计的软件.