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

2022-09-01 04:41:09

Maven Compiler Plugin 文档指出

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

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

这两种编译模式与 maven 之间还有什么其他区别?是否有任何应该知道的输出差异?


答案 1

javac(作为“java编译器”)是一个可执行文件,理论上甚至可以是依赖于平台的可执行文件或脚本。调用此函数是为了将 a 编译为 ..java.class

在窗口上 是它的名字,它通常位于下面的某个地方。javac.exeC:\Program Files*\jdk*\bin

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

但是,因为它是用Java编写的,所以有一个更快的替代方案:从我们已经运行的jvm中,我们只是它的主类(例如。 或诸如此类),并称之为。这不需要启动不需要的 jvm。这就是maven所做的。只需10年,他们就足以正确地做到这一点。:-)importjavax.tools.JavaCompiler

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


答案 2

推荐