2013-11-26 3 views
28

Maven Plugin Compiler документация 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 compiler») является исполняемым файлом, который может быть теоретически даже зависящим от платформы исполняемым файлом или скриптом. Это вызывается для компиляции .java в .class.

На окнах это его имя javac.exe, и это обычно где-то ниже C:\Program Files*\jdk*\bin.

Этот компилятор был разработан в java. Это означает, что если мы запустим этот .exe, нужно запустить новую виртуальную машину Java. Это медленно.

Но, поскольку он был написан на Java, существует гораздо более быстрая альтернатива этому: из нашего уже запущенного jvm мы просто import его основной класс (например, javax.tools.JavaCompiler или такой) и назовем это. Это не нужно запускать ненужный jvm. Это то, что делает maven. Просто 10 лет было достаточно, чтобы сделать это правильно. :-)

Конечно, у него также есть запасные части. Наиболее вероятной причиной является то, что в случае внутреннего компилятора он должен запускаться из одного и того же jvm и в том же пространстве имен, что и ядро ​​maven. Также указание альтернативного jvm невозможно, и могут быть и некоторые побочные эффекты, возникающие в результате конфликтов пространства имен. Но они очень маловероятны, потому что оба они хорошо спроектированы.

+0

Хорошие моменты. Я хочу получить больше информации о различиях между функциональными возможностями этих двух способов, например различиями в исходном сообщении. – Vic

+0

@Vic Я немного расширил свой ответ и сделаю еще немного. – peterh

+0

Спасибо. То, что я хотел, было объяснением того, почему один режим бросает ошибки, а второй - нет. И другие отличия, если существуют – Vic