【问题标题】:What is the difference between using javac and javax.tools.JavaCompiler?使用 javac 和 javax.tools.JavaCompiler 有什么区别?
【发布时间】:2013-11-26 12:12:35
【问题描述】:

Maven 编译器插件文档states

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

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

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

【问题讨论】:

  • 可能无关紧要,但你能发布你的 maven 编译器插件配置吗?
  • 我认为在你的情况下(引导)类路径是不同的。区别主要在于环境的设置方式(通过启动器与插件)。默认选项也可能不同,但我不这么认为。

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


【解决方案1】:

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 是不可能的,并且命名空间冲突也可能会产生一些副作用。但它们的可能性很小,因为它们都是精心设计的软件。

【讨论】:

  • 好点,我确实想了解更多关于这两种方式的操作功能差异的信息,比如原始帖子中的差异。
  • @Vic 我稍微扩展了我的答案,并且会做一点。
  • 谢谢。我想要的是解释为什么一种模式会引发错误而第二种模式不会。以及其他差异(如果存在)
  • @Vic 最可能的原因是,在外部情况下,您使用的 java 编译器与内部情况不同(与 maven 使用的情况相同)。
猜你喜欢
  • 2011-03-04
  • 1970-01-01
  • 2010-10-20
相关资源
最近更新 更多