2013-11-26 83 views
28

Maven的编译器插件文件states使用javac和javax.tools.JavaCompiler有什么区别?

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

事实上,当我们打造的是没有指定forceJavacCompilerUse插件选项有一些构建错误,例如,当代码引用com.sun.包(遗产,我们知道它是一个坏主意......)

这两种编译模式和maven有什么不同?应该知道哪些产出差异?

+3

+1好问题 –

+0

也许不相关,但是你可以发布你的maven编译器插件配置吗? – Yaneeve

+2

JavaDoc:http://docs.oracle.com/javase/6/docs/api/javax/tools/JavaCompiler.html – Raedwald

回答

14

javac(作为“java编译器”)是一个可执行文件,理论上它可能是一个依赖于平台的可执行文件或脚本。这被称为将.java编译为.class

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

这个编译器也是用java开发的。这意味着,如果我们启动这个.exe,需要启动一个新的Java虚拟机来运行它。这很慢。但是,因为它是用Java编写的,所以它有一个更快的选择:从我们已经运行的jvm中,我们只需要import其主类(f.e. javax.tools.JavaCompiler或类似)并调用它。这并不需要启动不需要的jvm。这就是maven所做的。只需10年,他们就足以做出正确的决定。 :-)

当然它也有一些倒退。最可能的原因是,在内部编译器的情况下,它需要从maven内核的相同jvm和相同名称空间运行。另外指定一个替代的jvm是不可能的,并且也可能由于命名空间冲突而产生一些副作用。但它们是非常不可能的,因为它们都是精心设计的软件。

+0

好点,我希望获得有关这两种方式的操作功能之间差异的更多信息,例如原始帖子中的差异。 – Vic

+0

@Vic我稍微扩展了我的答案,并且还会做一点。 – peterh

+0

谢谢。我想要的是解释为什么一种模式会抛出错误,而另一种模式则不会。和其他差异,如果存在 – Vic