Подтвердить что ты не робот

В чем разница между использованием javac и javax.tools.JavaCompiler?

Документация плагина Maven Compiler состояния:

Плагин компилятора используется для компиляции источников вашего проекта. Начиная с версии 3.0, компилятор по умолчанию - javax.tools.JavaCompiler(если вы используете java 1.6) и используется для компиляции источников Java. Если вы хотите принудительно подключить плагин с помощью javac, вы должны настроить параметр плагина forceJavacCompilerUse

И действительно, когда forceJavacCompilerUse не указан в нашей сборке, есть некоторые ошибки сборки, например, когда код ссылается на пакеты com.sun. (наследие, мы знаем, что его плохая идея...)

Каковы другие различия между этими двумя режимами компиляции вообще и с maven? Существуют ли какие-либо различия в выходе, которые следует знать?

4b9b3361

Ответ 1

javac (как "java compiler" ) - это исполняемый файл, который может быть теоретически даже зависимым от платформы исполняемым файлом или script. Это вызывается для компиляции .java в .class.

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

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

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

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