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

标签 java maven jvm javac java-compiler-api

Maven 编译器插件文档 states :

The Compiler Plugin is used to compile the sources of your project. Since 3.0, the default compiler is javax.tools.JavaCompiler (if you are using java 1.6) and is used to compile Java sources. If you want to force the plugin using javac, you must configure the plugin option forceJavacCompilerUse

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

这两种编译模式一般与 maven 有什么其他区别?有没有应该知道的输出差异?

最佳答案

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

在windows上是它的名字javac.exe,它通常在C:\Program Files*\jdk*\bin下面的某个地方。

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

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

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

关于java - 使用 javac 和 javax.tools.JavaCompiler 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20216774/

相关文章:

android - 无法访问 'java.lang.Object' 这是...的父类(super class)型检查您的模块类路径是否存在缺失或冲突的依赖项

java - 使用可用堆重复 Full GC

amazon-web-services - 在 ec2 上从 docker 运行 elasticsearch

java - 嵌套异常是 javax.jms.InvalidDestinationException : Unknown destination type - $Proxy115

java - 尝试访问数组java中的元素时表达式预期错误

java - Maven 无法读取我的 Cucumber 测试

java - "Error: JAVA_HOME is not defined correctly."在构建 Jikes rvm

java - 将 CrudRepository 中发出的命令转换为函数时出现问题

java - 如何在 Java 类中实现 Collection 字段的 getter/setter?

java - 如果操作系统不属于给定系列(例如 mac),如何激活 pom.xml?