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

时间:2013-11-26 12:12:35

标签: java maven jvm javac java-compiler-api

Maven编译器插件文档states

  

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

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

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

1 个答案:

答案 0 :(得分:15)

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是不可能的,并且可能还存在一些由命名空间冲突引起的副作用。但它们非常不可能,因为它们都是设计良好的软件。